使用TypeDescriptor获取私有属性
本文关键字:属性 获取 TypeDescriptor 使用 | 更新日期: 2023-09-27 18:12:30
我想在c#中使用TypeDescriptor获得类的私有属性。
到目前为止调用
TypeDescriptor.GetProperties(myType);
只返回公共的非静态属性。
我还没有找到一种方法如何影响GetProperties或GetProvider方法来强制它们返回"默认"(公共,非静态)成员以外的其他成员。
请不要建议反射(我很清楚BindingFlags),除非它给我一个PropertyDescriptor对象。
要做到这一点,您必须编写并注册一个自定义TypeDescriptionProvider
, 使用反射。但是,您当然可以这样做—您甚至可以使用实际与字段(而不是属性)通信的PropertyDescriptor
实例。您可能还需要编写自己定制的PropertyDescriptor
实现,因为ReflectPropertyDescriptor
是internal
(您也许可以使用反射来获得它)。最终,您将必须使用反射来实现,但是您可以实现TypeDescriptor.GetProperties(Type)
返回您想要的PropertyDescriptor
实例的要求。
您也可以对控件之外的类型执行此操作。然而,应该强调的是,你的意图是不同寻常的。
如果您正在使用.GetProperties(instance)
过载,那么您也可以通过实现ICustomTypeDescriptor
来实现这一点,这比完整的TypeDescriptionProvider
更简单。
有关挂钩定制提供程序的示例,请参见HyperDescriptor
您可以创建自己的CustomPropertyDescriptor
,它从PropertyInfo
获取信息。
最近我需要得到非公共属性的PropertyDescriptorCollection
。
在使用type.GetProperties(BindingFlags. Instance | BindingFlags.NonPublic)
获取非公共属性之后,然后使用下面的类创建相应的PropertyDescriptor
。
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;
}
}