能否覆盖现有.NET类型的类型描述符?

3

更具体地说:

1)我能否为属性分配类型描述符?

2)如果可以,最好的方法是在运行时获取类型转换器。

基本上,我有一些配置对象,使用反射进行填充。到目前为止,这只适用于简单类型(字符串、整数、日期时间),但我希望支持将逗号分隔的列表转换为List。

到目前为止,我通过从List<T>派生自定义类型“ConvertableList<T>”,并使用自定义类型转换器对其进行修饰来实现此目的。

1个回答

7

您可以将TypeConverter与现有类型关联,例如:

    TypeDescriptor.AddAttributes(typeof(List<int>),
        new TypeConverterAttribute(typeof(MyTypeConverter)));

在启动过程中的某个位置

然后,要获取转换器,标准代码应该可以工作:

    TypeConverter conv = TypeDescriptor.GetConverter(typeof(List<int>));

或者:

    object obj = new List<int>();
    ...
    TypeConverter conv = TypeDescriptor.GetConverter(obj);

我的描述符是否总是优先于默认值? - Ben Foster
1
@Ben - 对于使用 TypeDescriptor 的任何代码,是的。但是有些代码可能会决定检查 IList(非泛型)并以某种方式进行特殊处理。我无法更改他们的特殊情况代码。 - Marc Gravell
1
它们在很大程度上是累积的,所以这并不简单。尽量避免这样做的需要... 我猜测(未经测试)你可以通过存储提供程序(TypeDescriptor.GetProvider)并将旧值(TypeDescriptor.AddProvider)推回来来实现。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接