-1

我使用以下代码获取所有对象实例:

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

但我无法更改Enabled按钮等属性,因为SetValue获取实例类的目标而我没有这个。我只有班级的名称和类型。现在如何更改字段中存在的对象的属性(启用)。

4

2 回答 2

1

尝试稍微修改您的反射代码。一方面,您必须同时引用对象和property您特别想要的对象。记住,Property不一样Field

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

您使用任何类型,无论MyObject是按钮还是表单或其他...然后您通过 name 引用该属性Enabled,然后将其设置回MyObject.

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

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

您可以使用this来获取属性集,但如果thisType您尝试启用/禁用的控件不同,则不建议使用。

添加编辑

在重新阅读了这个问题后,我从中得到了这个:你似乎想要的是多层反射和泛型。您正在寻找的控件是附加到“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);
    }
}
于 2013-02-25T17:30:51.000 回答
0

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

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

一旦你有了它,你的 enabled 属性可能会这样设置:

myenabledPropertyInfo.SetValue(targetObject, value, null);

其中 targetobject 是我们感兴趣的 Enabled 属性的对象,而 value 是我们希望分配的值(在这种情况下,大概是一个布尔值......)

希望有帮助...

于 2013-02-25T17:31:20.260 回答