关于c#:使用TypeDescriptor获取私有属性

Get private properties with TypeDescriptor

我想使用c中的typescriptor获取类的私有属性。

到目前为止的电话

1
TypeDescriptor.GetProperties(myType);

只返回公共的非静态属性。

我还没有找到一种方法来影响GetProperties或GetProvider方法,以强制它们返回除"默认"(公共、非静态)成员之外的其他成员。

请不要建议反射(我很清楚绑定标志),除非它给了我一个PropertyDescriptor对象。


要做到这一点,您必须编写并注册一个使用反射的自定义TypeDescriptionProvider。但是,您当然可以这样做——您甚至可以拥有与字段(而不是属性)实际对话的PropertyDescriptor实例。您可能还需要编写自己的bespke PropertyDescriptor实现,因为ReflectPropertyDescriptorinternal(您可以使用反射来获得它)。最终,您将不得不使用反射来实现,但是您可以实现TypeDescriptor.GetProperties(Type)返回您想要的PropertyDescriptor实例的要求。

您也可以对您控制之外的类型执行此操作。然而,应该强调的是,你的意图是不寻常的。

如果您使用的是.GetProperties(instance)重载,那么您也可以通过实现ICustomTypeDescriptor,这比完整的TypeDescriptionProvider更简单。

有关挂接定制提供程序的示例,请参见超描述符


您可以创建自己的CustomPropertyDescriptor,从PropertyInfo获取信息。

最近我需要得到非公共属性的PropertyDescriptorCollection

在我使用type.GetProperties(BindingFlags. Instance | BindingFlags.NonPublic)获得非公共属性之后,然后使用下面的类创建相应的PropertyDescriptor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class CustomPropertyDescriptor : PropertyDescriptor
{
    PropertyInfo propertyInfo;
    public CustomPropertyDescriptor(PropertyInfo propertyInfo)
        : base(propertyInfo.Name, Array.ConvertAll(propertyInfo.GetCustomAttributes(true), o => (Attribute)o))
    {
        this.propertyInfo = propertyInfo;
    }
    public override bool CanResetValue(object component)
    {
        return false;
    }

    public override Type ComponentType
    {
        get
        {
            return this.propertyInfo.DeclaringType;
        }
    }

    public override object GetValue(object component)
    {
        return this.propertyInfo.GetValue(component, null);
    }

    public override bool IsReadOnly
    {
        get
        {
            return !this.propertyInfo.CanWrite;
        }
    }

    public override Type PropertyType
    {
        get
        {
            return this.propertyInfo.PropertyType;
        }
    }

    public override void ResetValue(object component)
    {
    }

    public override void SetValue(object component, object value)
    {
        this.propertyInfo.SetValue(component, value, null);
    }

    public override bool ShouldSerializeValue(object component)
    {
        return false;
    }
}