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)
谢谢!
如果名称已知且已修复,则一种简单的方法是:
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实现,我认为没有必要使用它来执行.
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |