【问题标题】:Reflection: Set a property of a generic object using delegates反射:使用委托设置通用对象的属性
【发布时间】:2012-05-16 11:37:40
【问题描述】:

我正在开发一个简单的 ORM 库,其实很简单...

我有一个 T 类型的查询

public IEnumerable<T> Query<T>(string query)

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

aProperty.SetValue(tmpGenericObjectOfTypeT, newValue, null);

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

正如我所读到的,使用委托更优雅一些,我想要那个解决方案,但我真的不知道该怎么做,我已经搜索并找到了很多关于如何调用方法的信息使用委托,而不是如何设置属性...

【问题讨论】:

  • 除非您已经知道您的财产代表的姓名,否则不会真正帮助您。由于您想在运行时执行此操作,因此您会通过 Reflection.Emit 或使用 ExpressionTrees 进行反射或元编程。两者都不是令人愉快的,但如果你想要更多的表现,那么你将不得不硬着头皮。
  • 看起来像发射它。谢谢。如果我让他们实现一个基类,这样我就知道委托的名字了,那不行吗?

标签: c# reflection


【解决方案1】:

Dynamic methodsexpression trees 知道如何获取/设置属性是这里的方法。快速简单。

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

与反射相比,您应该会看到至少 20 倍的性能提升(如果不是 50-100 倍的话)。

【讨论】:

  • 看起来表达式树不使用 Emit,这对我来说是一个不错的选择,因为我不知道如何使用它。非常感谢!关于在哪里可以阅读有关表达式树的更多信息的任何提示?
  • 我包含的链接是一个好的开始,并且这里至少有一些表达式树大师。如果您找不到现有答案,只需打开一个新问题。
【解决方案2】:

HyperDescriptor 运行良好(基于ReflectionEmit)。 http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces

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

【讨论】:

猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2010-10-26
  • 2020-05-18
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多