我已经创建了一个简单的方法来返回一个属性,我知道它是一个对象中的属性层次结构中的一个字符串。例如,对象"contract“具有属性"Person”,子属性为"Contact“,子属性(已知为字符串)为"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);
}谢谢!
发布于 2012-02-14 16:15:30
如果名称已知且固定,一种简单的方法是:
dynamic obj = ...
string name = obj.Person.Contract.PhoneNumber;dynamic实现在内部进行了优化,所以这个不会每次都做大量的反射--它只按类型解析。
至于“有多快”,你需要对它进行分析--然而,常规的反射实现是基于PropertyInfo的,而且速度不是很快。对于ad-hoc使用来说,速度足够快,但在紧凑的循环中,就不是那么好了。
如果您想要比使用dynamic (在编译时需要名称)更优化和更灵活,那么可以使用FastMember;它同时具有基于类型和基于实例的API,并且经过了故意优化;用于任意属性获取:
var acc = ObjectAccessor.Create(obj);
string propName = "PhoneNumber";
var value = acc[propName];在那篇文章中,我还提到了HyperDescriptor,这是一个使用PropertyDescriptor应用程序接口的以前的实现(但经过了优化)--但是,除非您需要使用 PropertyDescriptor实现,否则我认为没有必要强制使用它。
发布于 2012-02-14 15:52:04
像往常一样,测试并查看。我建议一个潜在的更好的替代方案。
使用反射(或使用TypeDescriptor).
Dictionary.
在我的经验中,这总是比在运行时发现成员信息的任何事情都要快(有时是显着的)。示例代码中的字符串操作、循环、多个方法调用等看起来比使用基于键的查找和调用单个方法的开销要大得多。
documentation on TypeDescription声明缓存在内部使用是为了提高性能,所以它能产生多大的差异只能通过测试来揭示。
https://stackoverflow.com/questions/9273366
复制相似问题