当前位置:  开发笔记 > 编程语言 > 正文

关于ComponentModel和Reflection

如何解决《关于ComponentModel和Reflection》经验,为你挑选了1个好方法。

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

它目前看起来像这样:

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类.当性能存在问题时,两个框架(Reflection和ComponentModel)之间有什么区别.将使用ComponentModel重写上面的内容会实现更好的性能还是灵活性?我知道这两者之间唯一的另一个区别是CM支持虚拟属性.

TY.



1> Marc Gravell..:

不同之处在于ComponentModel是对原始类的抽象.这意味着您可以定义不存在的属性- 实际上,这正是DataView/ 如何DataRowView将列作为数据绑定的属性公开.使用ComponentModel,你甚至可以在1.1中获得类似"动态"的东西.

您可能认为这意味着ComponentModel更慢; 但实际上,你可以利用这个抽象来获取... HyperDescriptor正是这样做 - 使用Reflection.Emit直接IL来表示属性,比反射或vanilla ComponentModel提供更快的访问速度.

但请注意,默认情况下,ComponentModel仅限于属性(不是字段).你可以通过即时PropertyDescriptor外观来做到这一点,但这不是一个好主意.ComponentModel中的"只写"属性也没有多少位置.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有