C# 类型描述符性能

C# 类型描述符性能,c#,performance,typedescriptor,C#,Performance,Typedescriptor,我创建了一个简单的方法来返回一个属性,我知道该属性是对象中属性层次结构中的字符串。例如,对象“contract”和属性“Person”以及子属性“Contact”和子属性(已知为字符串)“PhoneNumber” 我打算将该方法用于特定的动态绑定目的 调用该方法类似于:GetProperty(合同,“Person.Contact.PhoneNumber”) 我想知道以下代码对性能的影响是什么: public string GetProperty(object obj, string name)

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

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

调用该方法类似于:GetProperty(合同,“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);
    }
publicstringgetproperty(对象对象,字符串名称)
{
string[]index=name.Split('.');
对象结果=空;
for(int i=0;i

谢谢

一如既往,测试并查看。我建议一个可能更好的选择

  • 使用反射(或
    TypeDescriptor
    的方法)一次检索所有属性
  • 使用或创建getter/setter
  • 将这些getter/setter缓存在
    字典中
  • 让您的方法查看字典并调用getter/setter
  • 根据我的经验,这总是比任何涉及在运行时发现成员信息的事情都要快(有时明显)。示例代码中的字符串操作、循环、多个方法调用等看起来比使用基于键的查找并调用单个方法要昂贵得多


    声明缓存在内部用于提高性能,因此,只有通过测试才能揭示它的影响

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

    dynamic obj = ...
    string name = obj.Person.Contract.PhoneNumber;
    
    动态
    实现在内部进行了优化,因此该不会每次都进行大量的反射-它只针对每种类型进行解析

    至于“速度有多快”,您需要对其进行分析——然而,常规反射实现是基于
    PropertyInfo
    ,速度并不惊人。速度足够快,可以临时使用,但在一个紧密的循环中,不是很好

    如果您希望比使用
    动态
    (在编译时需要名称)更灵活地进行优化,那么可能;它既有基于类型的API,也有基于实例的API,并且经过刻意优化;任意属性获取的用法:

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

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

    为什么不只使用obj.GetType().GetProperty(index[I],BindingFlags.IgnoreCase)?正在访问的对象已经存在,它们是DataObjects.net实体,我相信它们有一个自定义类型描述符?()抓取数据以填充自定义CSV,该格式在填充时在文件中定义。-这有意义吗?@Carl如果它使用自定义描述符,那么任何人都不可能对性能发表评论;性能完全由自定义实现决定