TypeDescriptor Peformance

Tys*_*yst 3 c# performance typedescriptor

我创建了一个简单的方法来返回一个属性,我知道它是一个来自对象属性层次结构的字符串.例如,对象与具有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);
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mar*_*ell 6

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

dynamic obj = ...
string name = obj.Person.Contract.PhoneNumber;
Run Code Online (Sandbox Code Playgroud)

dynamic实现内部优化,所以这不会每次都做大量的反思-这是每个类型只解决.

至于"多快",你需要配置文件了-但是,正反射实现是基于PropertyInfo,而不是光荣快.足够快,可以临时使用,但是在紧密的循环中,不是那么好.

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

var acc = ObjectAccessor.Create(obj);
string propName = "PhoneNumber";
var value = acc[propName];
Run Code Online (Sandbox Code Playgroud)

在那篇文章中,我还提到HyperDescriptor,使用了一个以前的实现PropertyDescriptorAPI(但优化的) -但是,除非你需要PropertyDescriptor实现,我认为没有必要使用它来执行.