1

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

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

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

4

1 回答 1

3

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

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

所以基本上:研究TypeDescriptionProvider

于 2013-10-07T10:02:22.717 回答