加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – TypeDescriptor Peformance

发布时间:2020-12-16 01:51:10 所属栏目:百科 来源:网络整理
导读:我创建了一个简单的方法来返回一个属性,我知道它是一个来自对象属性层次结构的字符串.例如,对象与具有Subproperty“Contact”的属性“Person”的“契约”和子属性(已知已经是一个字符串)“PhoneNumber” 我打算将该方法用于特定的动态绑定目的. 调用该方法如
我创建了一个简单的方法来返回一个属性,我知道它是一个来自对象属性层次结构的字符串.例如,对象与具有Subproperty“Contact”的属性“Person”的“契约”和子属性(已知已经是一个字符串)“PhoneNumber”

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

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

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

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);
    }

谢谢!

解决方法

如果名称已知且已修复,则一种简单的方法是:

dynamic obj = ...
string name = obj.Person.Contract.PhoneNumber;

动态实现在内部进行了优化,因此每次都不会进行大量的反射 – 它只是按类型解析.

至于“有多快”,你需要对它进行分析 – 但是,常规反射实现基于PropertyInfo,而且速度并不快.足够快,可以临时使用,但是在紧密的循环中,不是那么好.

如果你想要优化和更灵活,而不是使用动态(在编译时需要名称),那么可能是FastMember;这有基于类型和基于实例的API,并且是有意优化的;用于任意属性获取的用法:

var acc = ObjectAccessor.Create(obj);
string propName = "PhoneNumber";
var value = acc[propName];

在那篇文章中,我还提到了HyperDescriptor,这是一个使用PropertyDescriptor API的先前实现(但已经过优化) – 但是,除非你需要PropertyDescriptor实现,否则我认为没有必要强制使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读