ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor

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

有人能告诉我这是对的吗,还是我错过了一些重要的概念或观点? 我真的只是想明白为什么和什么时候你会使用每个类。

ICustomTypeDescriptor

  • 在类中全部实现此接口将覆盖类的本地属性,并将其replace为由ICustomTypeDescriptor.GetProperties()返回的PropertyDescriptors。

TypeDescriptionProvider

  • 用于扩展一个类的现有属性
  • TypeDescriptionProvider通过TypeDescriptionProvider属性附加到类
  • TypeDescriptionProvider的GetTypeDescriptor()方法返回一个ICustomTypeDescriptor以附加到该types的现有属性。
  • PropertyGrid将显示通过Reflectionfind的类的属性,以及通过TypeDescriptionProvider添加到类的属性

types转换器

  • types之间转换
  • 就使用PropetyGrid而言,可以在属性网格中显示/编辑复杂types和基本types之间进行转换。
  • TypeConverter的GetStandard值方法也可以用来显示propertygrid中可能值的列表

UITypeEditor的

  • 定义一个用于处理复杂types属性的自定义编辑器。
  • 通过属性关联属性。

所以ICustomTypeDescriptor是一个TypeDescription提供程序,用于添加/更改/replace对象的整个属性。 TypeConverter和UITypeEditor应用于各个属性,并控制这些特定属性的接口方式。

调整:

  • TypeDescriptionProvider

    • 仍然取代元数据(不扩展)
    • 也可以添加TypeDescriptor.AddProvider
    • 可以应用于每个types以及每个实例,使得可以应用于列表而不必实施ITypedList
  • TypeConverter

    • 对于PropertyGrid ,这也是用于获取元数据的机制; 请注意, ExpandableObjectConverter只是委托给TypeDescriptor.GetProperties ,但事实并非总是如此
    • 还负责重新创build具有更改的不可变对象(如结构)
  • UITypeEditor

    • 还负责绘制PropertyGrid的预览框

额外:

  • IExtenderProvider附加属性; 这可能是你与TypeDescriptionProvider混淆
  • ITypedList – 广泛的ICustomTypeDescriptor的孪生,但对于列表; 可以通过在任何IList上使用TypeDescriptionProvider和非对象索引器来避免,例如public T this[int index] {get;}
  • IListSource – 在数据源和数据之间提供间接性; 例如, DataTable实现IListSource ,在请求时返回DefaultView