ComponentModelreflection(例如PropertyDescriptor)和标准reflection(例如PropertyInfo)之间的区别?

你能用它们做什么之间有明显的重叠。 ComponentModelreflection的东西在System.Reflection之上只是一个更友好的层吗?

不 – 还有更多。 ComponentModel允许您执行一些DLR类型的操作,例如运行时属性。 这就是DataView将列公开给网格的方式 – 它们不是reflection属性 – 它们是运行时属性。 这里的关键字是ICustomTypeDescriptorTypeDescriptionProvider

该模型还允许抽象和间接。 例如,如果您对属性进行了大量反思,请考虑使用HyperDescriptor – 这是我编写的一个实用程序,它使用自定义PropertyDescriptor实现来交换预编译模型的reflection模型,从而获得巨大的性能提升。

在使用方面,还有一些其他差异; ComponentModel仅支持成员上任何属性的单个实例(与reflection不同,其中允许多个相似的属性)。 它是以数据为中心的 – 因此存在属性,事件(主要用于更改通知)也存在 – 但是没有字段或方法。

它也对i18n有很好的支持 – 因为DisplayName等可以即时定制。

但是,ComponentModel并不(直接)与LINQ(特别是MemberExpression)之类的东西兼容 – 因为它想要绑定到reflection数据。

最后,ComponentModel在IDE中被高度使用,比如PropertyGrid(这就像工具提示的额外属性一样),但同样几乎所有的UI数据绑定都是通过ComponentModel发生的(因为这允许绑定支持DataTable,类,以及你能想到的任何其他事情)。