首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于ComponentModel与反射

关于ComponentModel与反射
EN

Stack Overflow用户
提问于 2009-05-05 12:35:35
回答 1查看 1.8K关注 0票数 4

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

目前的情况如下:

代码语言:javascript
复制
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对虚拟属性的支持。

泰。

EN

回答 1

Stack Overflow用户

发布于 2009-05-05 12:46:53

区别在于ComponentModel是对原始类的抽象。这意味着您可以定义不存在的属性-实际上,这正是DataView / DataRowView将列公开为数据绑定属性的方式。使用ComponentModel,您可以获得类似于“动态”的东西,甚至在1.1中也是如此。

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

但是,请注意,默认情况下,ComponentModel仅限于属性(而不是字段)。你可以通过飞行的PropertyDescriptor正面来做,但这不是个好主意.在ComponentModel中也没有太多的“只写”属性。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/824676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档