首页 / C# / c# – 循环中的Efficent反射
c# – 循环中的Efficent反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 循环中的Efficent反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1609字,纯文字阅读大概需要3分钟。
内容图文
![c# – 循环中的Efficent反射](/upload/InfoBanner/zyjiaocheng/789/4ef25fad1d0644c3a3ead283f68ddf0a.jpg)
在循环中使用反射时遇到性能问题.问题是我用它来重复访问长依赖链末端的对象.例如,在这种情况下
class FirstObject
{
public SecondObject sO;
}
class SecondObject
{
public ThirdObject tO;
}
class ThirdObject
{
public FourthObject fO;
}
class FourthObject
{
public object neededValue;
}
由于我只对最后一个对象包含的值感兴趣,因此我需要使用GetProperty()重复遍历整个链.GetValue()
FirstObject – > SecondObject – > ThirdObject – > FourthObject [neededValue]
有没有办法,也许是一些API,可以用来缩短链或在这种情况下只保存到requiredValue的整个路径?
澄清
我需要使用包含FirstObjects的列表来执行此操作.我无法重写代码来降低嵌套级别:它是自动生成的.
解决方法:
有一个技巧可以使用而不是反射的GetValue().它肯定更快,但代码可读性会更糟.
object GetPropertyValue(object obj, string propertyName)
{
MethodInfo propertyGetter = obj.GetType().GetMethod("get_" + propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
Func<object> getPropertyValue = (Func<object>)Delegate.CreateDelegate(typeof(Func<object>), obj, propertyGetter);
return getPropertyValue();
}
在这里,我们使用一点“黑客”知道属性getter只是一个具有预定义名称的方法:get_< PropertyName>().
如果您的对象层次结构每次都相同,您甚至可以从上面的示例缓存propertyGetter对象并重复使用它.
UPDATE
您甚至可以在没有具体对象引用的情况下为属性getter创建委托.因此,您可以将此委托与许多对象(相同类型)一起使用:
Func<ObjectType, object> getPropertyValue = (Func<ObjectType, object>)Delegate.CreateDelegate(typeof(Func<ObjectType, object>), propertyGetter);
ObjectType obj;
var propertyValue = getPropertyValue(obj);
如果缓存getPropertyValue()委托,那么性能将比调用GetValue()方法更好.
内容总结
以上是互联网集市为您收集整理的c# – 循环中的Efficent反射全部内容,希望文章能够帮你解决c# – 循环中的Efficent反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。