c# - 类型描述符性能

标签 c# performance typedescriptor

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

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

调用该方法如下所示: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;

dynamic 实现在内部进行了优化,因此这不会每次都进行大量反射 - 它仅针对每个类型进行解析。

至于“多快”,您需要对其进行分析 - 然而,常规反射实现是基于 PropertyInfo 的,并且速度不是极好的。对于临时使用来说足够快,但在紧密的循环中,不是很好。

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

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

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

关于c# - 类型描述符性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273366/

相关文章:

r - 当计算相同时,为什么 R 会随着时间的推移而减慢?

performance - 在 postgres 中索引日期字段的推荐方法?

data-binding - 绑定(bind) IList<IMyInterfaceType> 不显示 IMyInterface 继承的接口(interface)的成员

c# - LINQ:在列表中查找频率 = 1 的项目

c# - 在 C# 中如何检查某个日期是否已经过去?

c# - .NET 的良好 Tiff 库

c# - 以编程方式向方法或参数添加属性

c# - 相同的 XAML,但用户控件背后的代码不同

performance - 大型邮件的 Electron IPC替代品

c# - 将类型描述符添加到所有 List<T> 以实现属性网格扩展的通用实现?