ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor

Eri*_*tas 38 c# propertygrid uitypeeditor typeconverter customtypedescriptor

我试图全面了解如何使用ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor来更改PropertyGrid显示和与对象接口的方式.

有人可以告诉我这是对的,还是我错过了任何重大概念或要点?我真的只是想了解为什么以及何时使用每个班级.

ICustomTypeDescriptor

  • 在类中实现此接口会完全覆盖类的本机属性,并将其替换为ICustomTypeDescriptor.GetProperties()返回的PropertyDescriptors.

TypeDescriptionProvider

  • 用于扩展类的现有属性
  • TypeDescriptionProvider通过TypeDescriptionProvider属性附加到类
  • TypeDescriptionProvider的GetTypeDescriptor()方法返回要附加到该类型的现有属性的ICustomTypeDescriptor .
  • PropertyGrid将显示通过Reflection找到的类的属性,以及通过TypeDescriptionProvider添加到类的属性

类型转换器

  • 在类型之间转换
  • 在使用PropetyGrid方面,用于在可以在属性网格中显示/编辑的复杂类型和基元类型之间进行转换.
  • TypeConverter的GetStandard值方法还可用于显示propertygrid中可能值的列表

UITypeEditor的

  • 定义用于操作复杂类型属性的自定义编辑器.
  • 通过属性与属性相关联.

因此,ICustomTypeDescriptor和TypeDescription提供程序用于添加/更改/替换对象的整个属性.TypeConverter和UITypeEditor应用于各个属性,并控制这些特定属性的接口方式.

Mar*_*ell 38

调整:

  • TypeDescriptionProvider

    • 仍然替换元数据(不扩展)
    • 也可以添加 TypeDescriptor.AddProvider
    • 可以应用于每个类型以及每个实例,从而可以在不必实现的情况下应用于列表 ITypedList
  • TypeConverter

    • 因为PropertyGrid,这也是用于获取元数据的机制; 请注意,ExpandableObjectConverter只需委托TypeDescriptor.GetProperties,但情况并非总是如此
    • 还负责通过更改重新创建不可变对象(如结构)
  • UITypeEditor

    • 还负责绘制预览框 PropertyGrid

额外:

  • IExtenderProvider- 追加财产; 这可能是你感到困惑的原因TypeDescriptionProvider
  • ITypedList- 广泛的双胞胎ICustomTypeDescriptor,但列表; 可以通过TypeDescriptionProvider在任何上使用和非对象索引器来避免IList,即public T this[int index] {get;}
  • IListSource - 提供数据源和数据之间的间接; 例如,一个DataTable工具IListSource,DefaultView在请求时返回