你可以用它们做的事情有明显的重叠。 ComponentModel 反射只是在 System.Reflection 之上更友好一点的层吗?
最佳答案
不 - 还有更多。 ComponentModel 允许您做一些 DLR 类型的事情,例如运行时属性。这就是 DataView 向网格公开列的方式——它们不是反射属性——它们是运行时属性。此处的关键字是 ICustomTypeDescriptor
和 TypeDescriptionProvider
。
此模型还允许抽象和间接。例如,如果您正在对属性进行大量反射(reflection),请考虑 HyperDescriptor - 这是我编写的一个实用程序,它使用自定义 PropertyDescriptor
实现将反射模型交换为预编译模型,以实现巨大的性能提升。
在用法上,还有一些其他的区别; ComponentModel 仅支持成员上任何属性的单个实例(与反射不同,反射允许多个相似的属性)。它以数据为中心 - 因此属性和事件(主要用于更改通知)一样存在 - 但没有字段或方法。
它对 i18n 也有很好的支持——因为 DisplayName 等可以动态定制。
但是,ComponentModel 不(直接)兼容 LINQ(特别是 MemberExpression)之类的东西 - 因为它想要绑定(bind)到反射数据。
最后,ComponentModel 在 IDE 中被 PropertyGrid 之类的东西大量使用(这就是工具提示的额外属性的工作方式),但同样几乎所有 UI 数据绑定(bind)都是通过 ComponentModel 发生的(因为这允许绑定(bind)支持DataTable、类以及您能想到的任何其他内容)。
关于c# - ComponentModel 反射(例如 PropertyDescriptor)和标准反射(例如 PropertyInfo)之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301356/