我创建了一个实现ICustomTypeDescriptor的泛型类Group。 它只是将泛型类型参数的属性添加到它自己的属性中。
private void InitializeDisplayedProperties()
{
_DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["LastItem"]);
_DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["GroupId"]);
_DisplayedProperties.Add(TypeDescriptor.GetProperties(typeof(Group<T>))["Count"]);
foreach (PropertyDescriptor myDescr in TypeDescriptor.GetProperties(typeof(T)))
{
_DisplayedProperties.Add(myDescr);
}
}
为什么以下代码的行为不同?
TypeDescriptor.GetProperties(typeof(Group<IGroupedObject>)).Count //Returns 3 Items of Group only
TypeDescriptor.GetProperties(new Group<IGroupedObject>()).Count //Returns all 31 Items of Group and generic type parameter
我认为这必须与在对象的实例时生成属性这一事实有关。但是,使用的类型已经定义了属性的数量吗?
是否可以在不实例化类型的情况下解决此问题?
答案 0 :(得分:2)
我假设您的实际类型实现了ICustomTypeDescriptor
;如果是这种情况,那么只有TypeDescriptor.GetProperties(object)
API可以访问数据,因为它不愿意创建一个临时实例来获取属性(实际上,如果类型实现的话,这很常见) ICustomTypeDescriptor
,属性因实例而异,因此无论如何都不会有用。)
如果您希望整个类型支持此功能,则需要创建并注册TypeDescriptionProvider
。这在更高级别工作,并允许自定义属性应用于该类型,而无需考虑实例。关于这一点的好处是,它将自动应用于列表等,而无需实现ITypedList
。
基本上是:研究TypeDescriptionProvider
。