当使用ICustomTypeDescriptor时,为什么TypeDescriptor.GetProperties对于类型和对象的行为不同

时间:2013-10-07 09:56:31

标签: c# generics icustomtypedescriptor

我创建了一个实现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

我认为这必须与在对象的实例时生成属性这一事实有关。但是,使用的类型已经定义了属性的数量吗?

是否可以在不实例化类型的情况下解决此问题?

1 个答案:

答案 0 :(得分:2)

我假设您的实际类型实现了ICustomTypeDescriptor;如果是这种情况,那么只有TypeDescriptor.GetProperties(object) API可以访问数据,因为它不愿意创建一个临时实例来获取属性(实际上,如果类型实现的话,这很常见) ICustomTypeDescriptor,属性因实例而异,因此无论如何都不会有用。)

如果您希望整个类型支持此功能,则需要创建并注册TypeDescriptionProvider。这在更高级别工作,并允许自定义属性应用于该类型,而无需考虑实例。关于这一点的好处是,它将自动应用于列表等,而无需实现ITypedList

基本上是:研究TypeDescriptionProvider