gpt4 book ai didi

c# - 类型描述符性能

转载 作者:行者123 更新时间:2023-11-30 14:15:48 25 4
gpt4 key购买 nike

我创建了一个简单的方法来返回一个属性,我知道它是一个来自对象属性层次结构的字符串。例如,具有属性“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com