反射:使用委托设置通用对象的属性

时间:2012-05-16 03:14:31

标签: c# reflection

我正在研究一个简单的ORM库,事实上非常简单......

我有一个类型为T

的查询
public IEnumerable<T> Query<T>(string query)

该方法采用T类,它获取属性,循环遍历它们并相应地设置它们

aProperty.SetValue(tmpGenericObjectOfTypeT, newValue, null);

我的问题是SetValue非常慢,我看到了两个选择,使用Reflection.Emit或使用委托,遗憾的是我不知道如何做任何这些。

正如我所读到的,使用代理更优雅,我想要那个解决方案,但我真的不知道怎么做,我已经搜索并发现了很多关于如何调用方法使用Delegates,但不知道如何设置属性......

2 个答案:

答案 0 :(得分:1)

知道如何获取/设置属性的

Dynamic methodsexpression trees是这里的方法。快速而简单。

  • 使用反射检查您的类型界面
  • 构建getter / setter Actions/Funcs并将它们缓存在一个与原始类型相关的对象中。
  • 在后续操作中使用缓存的getter / setter。

你应该会看到至少比反射提高20倍的性能(如果不是更像50-100x)。

答案 1 :(得分:0)

HyperDescriptor工作得很好(基于ReflectionEmit)。 http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces

“委托”方法可能是指表达式树?