c#通过字段列表中的字符串名称设置属性



我用这段代码得到了对象的所有实例:

 Type type = this.GetType();
 FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic |
                                     BindingFlags.Instance);  

,但我不能改变属性,如Enabled按钮因为SetValue得到实例类的目标,我没有这个。我只知道名字和类型。现在如何改变属性(启用)的对象存在于字段

尝试稍微修改您的反射代码。首先,您必须同时引用对象和您特别想要的property。请记住,PropertyField是不一样的。

MyObject.GetType().GetProperty("Enabled").SetValue(MyObject, bEnabled, null);

你使用MyObject的类型,无论是按钮或表单或其他…然后通过名称Enabled引用属性,然后将其设置为MyObject

如果您想提前获取属性,您可以将实例存储在一个变量中,但再次记住,属性不是字段。

PropertyInfo[] piSet = MyObject.GetType().GetProperties();

您可以使用this来获得属性设置,但如果this与您试图启用/禁用的控件的Type不同,则不建议使用。

添加编辑

重读问题后,我得到了这个:你似乎想要的是多层反射和泛型。您正在寻找的控件是附加到"this"的字段。你所能做的就是这样做。

Type theType = this.GetType();
FieldInfo[] fi = theType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach ( FieldInfo f in fi)
{
    //Do your own object identity check
    //if (f is what im looking for)
    {
        Control c = f.GetValue(this) as Control;
        c.Enabled = bEnabled;
    }
    //Note: both sets of code do the same thing
    //OR you could use pure reflection
    {
        f.GetValue(this).GetType().GetProperty("Enabled").SetValue(f.GetValue(this), bEnabled, null);
    }
}

首先,您实际使用的是对象的字段。如果你真的想要可写属性,那么你需要这样的东西:

PropertyInfo[] properties = type.GetProperties(Public | SetProperty | Instance);

一旦你有了这个,你的enabled属性可以这样设置:

myenabledPropertyInfo.SetValue(targetObject, value, null);

其中targetobject是我们感兴趣的启用属性的对象,value是我们希望赋值的值(在本例中,可能是布尔值…)

相关内容

  • 没有找到相关文章

最新更新