我可以使用反射调用struct属性的“设置”方法吗?

我定义一个结构:

public struct Settable
{
     public string SettableProperty { get; set; }
}

我可以按照通常的方式设置结构属性的值:

s.SettableProperty = "Abc";

但是,当我创建一个尝试通过反射设置属性的方法时:

public T CreateWithValue<T>(string propName,string propValue)
{
    var retObj = activator.CreateInstance<T>();
    var prop = typeof(T).GetProperty(propName);

    var _ = prop.SetMethod.Invoke(retObj,new object[] { propValue});
    return retObj;
}

...然后这样称呼:

var x = CreateWithValue<Settable>("SettableProperty","Abc");

...我最终将SettableProperty初始化为其默认值null。 (不会引发异常。)

请注意,如果我将Settable定义为而不是结构,则该值将按预期设置。

是否可以使用反射设置结构属性?

code8945 回答:我可以使用反射调用struct属性的“设置”方法吗?

这里的问题是retObjT,是一种值类型,但是Invoke占用了object。此值,该值在堆上(在框内)创建一个隔离的副本,然后进行突变。 retObj中的本地副本不会受到任何影响,因为它是值的完全断开副本。

请考虑:

public T CreateWithValue<T>(string propName,string propValue)
{
    object retObj = Activator.CreateInstance<T>();
    var prop = typeof(T).GetProperty(propName);

    prop.SetMethod.Invoke(retObj,new object[] { typedValue });
    return (T)retObj;
}

这将创建一个框,更早,并将其取消装箱以获取修改后的值。但是,它不是很有效(请注意:我没有添加任何低效率;当使用带有值类型的object API时,低效率是固有的)。如果您希望获得更多的污垢,则可以删除分配。

本文链接:https://www.f2er.com/2483566.html

大家都在问