首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeDescriptor性能

TypeDescriptor性能
EN

Stack Overflow用户
提问于 2012-02-14 15:47:30
回答 2查看 2.8K关注 0票数 3

我已经创建了一个简单的方法来返回一个属性,我知道它是一个对象中的属性层次结构中的一个字符串。例如,对象"contract“具有属性"Person”,子属性为"Contact“,子属性(已知为字符串)为"PhoneNumber”

我打算将该方法用于特定的动态绑定目的。

调用该方法将如下所示: GetProperty(contract,"Person.Contact.PhoneNumber");

我想知道以下代码的性能影响是什么:

代码语言:javascript
复制
 public string GetProperty(object obj, string name)
    {
        string[] index = name.Split('.');
        object result = null;


        for (int i = 0; i < index.Length - 1; i++)
        {
            result = TypeDescriptor.GetProperties(obj).Find(index[i], true).GetValue(obj);

            if (result == null)
                return null;

            obj = result;
        }

        PropertyDescriptor pd = TypeDescriptor.GetProperties(result).Find(index.Last(), true);

        return (string)pd.GetValue(result);
    }

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-14 16:15:30

如果名称已知且固定,一种简单的方法是:

代码语言:javascript
复制
dynamic obj = ...
string name = obj.Person.Contract.PhoneNumber;

dynamic实现在内部进行了优化,所以这个不会每次都做大量的反射--它只按类型解析。

至于“有多快”,你需要对它进行分析--然而,常规的反射实现是基于PropertyInfo的,而且速度不是很快。对于ad-hoc使用来说,速度足够快,但在紧凑的循环中,就不是那么好了。

如果您想要比使用dynamic (在编译时需要名称)更优化和更灵活,那么可以使用FastMember;它同时具有基于类型和基于实例的API,并且经过了故意优化;用于任意属性获取:

代码语言:javascript
复制
var acc = ObjectAccessor.Create(obj);
string propName = "PhoneNumber";
var value = acc[propName];

在那篇文章中,我还提到了HyperDescriptor,这是一个使用PropertyDescriptor应用程序接口的以前的实现(但经过了优化)--但是,除非您需要使用 PropertyDescriptor实现,否则我认为没有必要强制使用它。

票数 6
EN

Stack Overflow用户

发布于 2012-02-14 15:52:04

像往常一样,测试并查看。我建议一个潜在的更好的替代方案。

使用反射(或使用TypeDescriptor).

  • Create或expression trees.

  • Cache的Dictionary.

  • Have中的dynamic methodsexpression trees.

  • Cache的getter/setter方法)一次检索所有属性您的方法将查找字典并调用getter/setter.

在我的经验中,这总是比在运行时发现成员信息的任何事情都要快(有时是显着的)。示例代码中的字符串操作、循环、多个方法调用等看起来比使用基于键的查找和调用单个方法的开销要大得多。

documentation on TypeDescription声明缓存在内部使用是为了提高性能,所以它能产生多大的差异只能通过测试来揭示。

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

https://stackoverflow.com/questions/9273366

复制
相关文章

相似问题

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