你能用它们做什么之间有明显的重叠。 ComponentModel反射是否只是System.Reflection上的一个更友好的层?
答案 0 :(得分:30)
不 - 还有更多。 ComponentModel允许您执行一些DLR类型的操作,例如运行时属性。这就是DataView将列公开给网格的方式 - 它们不是反射属性 - 它们是运行时属性。此处的关键字为ICustomTypeDescriptor
和TypeDescriptionProvider
。
该模型还允许抽象和间接。例如,如果您对属性进行了大量反思,请考虑HyperDescriptor - 这是我编写的一个实用程序,它使用自定义PropertyDescriptor
实现来交换预编译模型的反射模型,巨大的性能提升。
在使用方面,还有一些其他差异; ComponentModel仅支持成员上任何属性的单个实例(与反射不同,其中允许多个相似的属性)。它是以数据为中心的 - 所以属性存在,事件(主要用于变更通知)也存在 - 但是没有字段或方法。
它也对i18n有很好的支持 - 因为DisplayName等可以即时定制。
然而,ComponentModel并不(直接)与LINQ(特别是MemberExpression)之类的东西兼容 - 因为它想要绑定到反射数据。
最后,ComponentModel在IDE中被高度使用,例如PropertyGrid(这就是工具提示的额外属性之类的工作方式),但同样几乎所有UI数据绑定都是通过ComponentModel发生的(因为这允许绑定支持DataTable,类和您能想到的任何其他内容。)