我有一个接受任何对象的函数,然后它从它作为输入的属性或字段中获取值。
它目前看起来像这样:
private string GetFieldValue(object o, Field f)
{
//field.name is name of property or field
MemberInfo[] mi = o.GetType().GetMember(field.name, MemberTypes.Field | MemberTypes.Property,
BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.ExactBinding );
if (mi.Length == 0) throw new ArgumentException("Field", "Can't find member: " + f.name);
Object value;
if (mi[0].MemberType == MemberTypes.Property)
value = ((PropertyInfo)mi[0]).GetValue(o, null);
else value = ((FieldInfo)mi[0]).GetValue(o);
今天我阅读了 System.ComponentModel 及其 XXXDescriptor 类。
当性能有问题时,两个框架(反射和组件模型)之间有什么区别。使用 ComponentModel 重写上述内容会获得更好的性能或灵活性吗?我所知道的这两者之间的唯一其他区别是 CM 对虚拟属性的支持。
泰。
最佳答案
不同之处在于 ComponentModel 是对原始类的抽象。这意味着您可以定义 不存在的属性 - 实际上,这正是 DataView
/DataRowView
将列公开为数据绑定(bind)属性的方式。使用 ComponentModel,即使在 1.1 中,您也可以获得类似“动态”的东西。
您可能认为这意味着 ComponentModel 更慢;但实际上,您可以利用这种抽象来获取 yield ... HyperDescriptor 正是这样做的 - 使用 Reflection.Emit
编写直接 IL 来表示属性,提供比反射或普通 ComponentModel 更快的访问。
但是请注意,默认情况下 ComponentModel 仅限于属性(而不是字段)。您可以通过动态 PropertyDescriptor
外观来完成,但这不是一个好主意。 ComponentModel 中“只写”属性也没有太多位置。
关于c# - 关于 ComponentModel 和反射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/824676/