c# - ComponentModel 反射(例如 PropertyDescriptor)和标准反射(例如 PropertyInfo)之间的区别?

标签 c# reflection

你可以用它们做的事情有明显的重叠。 ComponentModel 反射只是在 System.Reflection 之上更友好一点的层吗?

最佳答案

不 - 还有更多。 ComponentModel 允许您做一些 DLR 类型的事情,例如运行时属性。这就是 DataView 向网格公开列的方式——它们不是反射属性——它们是运行时属性。此处的关键字是 ICustomTypeDescriptorTypeDescriptionProvider

此模型还允许抽象和间接。例如,如果您正在对属性进行大量反射(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/

相关文章:

c# - 通过反射加载程序集的风险

.net - 修复 .NET 程序中的错误,无需访问源代码

c# - 如何通过在字符串中指定其名称来获取枚举类型

c# - 转换 Func<> 类型

c# - 从 Facebook 应用程序中抓取数据

c# - 连接关闭后 SQLite 获取最后一行 ID

java - Reflection API 中 new Class[0] 的含义

用于实例化 scala.slick.lifted.TableQuery 的 Scala 反射

c# - 删除附件

c# - Silverlight 中的 UrlPathEncode?