【问题标题】:Is it possible to override the type descriptor for an existing .net type?是否可以覆盖现有 .net 类型的类型描述符?
【发布时间】:2011-01-17 12:33:18
【问题描述】:

或者更具体的

1) 我可以将类型描述符分配给属性

2) 如果是这样,在运行时获取类型转换器的最佳方法是什么。

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

到目前为止,我已经通过从 List<T> 派生一个自定义类型“ConvertableList<T>”并使用我的自定义类型转换器装饰它来实现这一点。

【问题讨论】:

    标签: .net reflection typeconverter


    【解决方案1】:

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

        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 - 对于任何使用 TypeDescriptor 的代码,是的。不过,某些代码可能会决定检查IList(非通用)并以某种方式对其进行特殊处理。我无法更改他们的特殊情况代码。
    • 它们在很大程度上是累积的,所以这并不简单。尽量避免这样做...我怀疑(未经测试)您可以通过存储 provider (TypeDescriptor.GetProvider) 并推回旧值 ( TypeDescriptor.AddProvider)。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多