C# 类型描述符性能
我创建了一个简单的方法来返回一个属性,我知道该属性是对象中属性层次结构中的字符串。例如,对象“contract”和属性“Person”以及子属性“Contact”和子属性(已知为字符串)“PhoneNumber” 我打算将该方法用于特定的动态绑定目的 调用该方法类似于:GetProperty(合同,“Person.Contact.PhoneNumber”) 我想知道以下代码对性能的影响是什么:C# 类型描述符性能,c#,performance,typedescriptor,C#,Performance,Typedescriptor,我创建了一个简单的方法来返回一个属性,我知道该属性是对象中属性层次结构中的字符串。例如,对象“contract”和属性“Person”以及子属性“Contact”和子属性(已知为字符串)“PhoneNumber” 我打算将该方法用于特定的动态绑定目的 调用该方法类似于:GetProperty(合同,“Person.Contact.PhoneNumber”) 我想知道以下代码对性能的影响是什么: public string GetProperty(object obj, string name)
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
的方法)一次检索所有属性字典中
声明缓存在内部用于提高性能,因此,只有通过测试才能揭示它的影响 如果名称已知且固定,一个简单的方法是:
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如果它使用自定义描述符,那么任何人都不可能对性能发表评论;性能完全由自定义实现决定