尝试稍微修改您的反射代码。一方面,您必须同时引用对象和property
您特别想要的对象。记住,Property
不一样Field
。
MyObject.GetType().GetProperty("Enabled").SetValue(MyObject, bEnabled, null);
您使用任何类型,无论MyObject
是按钮还是表单或其他...然后您通过 name 引用该属性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);
}
}