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