我有一个接受任何对象的函数,然后它从它作为输入的属性或字段中获取值。

它目前看起来像这样:

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/

10-10 22:38