【问题标题】:Reflection MemberInfo to Func<T1, T2>反射 MemberInfo 到 Func<T1, T2>
【发布时间】:2013-09-16 17:44:34
【问题描述】:

我正在寻找一种将MemberInfo 的实例转换为“Func”类型的方法(稍后通过 lambda 表达式使用它)。

假设我有一个类型的成员函数

public bool func(int);

使用反射,我以某种方式获得了MemberInfo“mi”的实例,现在我想将其转换为Func&lt;int, bool&gt;; 类型。类似:

Func<int, bool f = myType.GetMember(mi.Name);

有办法吗?

ps。 Marc Grawell 的回答解决了我的问题,不需要进一步的 cmets

【问题讨论】:

  • Func特定实例上的函数,而 MemberInfo 不绑定到实例。您的代码中有可用的实例吗?
  • 你想在什么目标上调用它?你知道它总是会返回bool 并接受int 吗?基本看Delegate.CreateDelegate...
  • 您可能想在您的前提下进行检查; “稍后通过 lambda 表达式使用它” - 获取委托不会帮助您使用 lambda 表达式

标签: c# reflection func


【解决方案1】:
Func<int,bool> f = Delegate.CreateDelegate(
           typeof(Func<int,bool>), target, (MethodInfo)mi);

注意这里target 是您要使用的对象,因为func 不是static 方法。如果它是 static 方法,您可以省略它(或传递 null)。或者,如果将 Func&lt;Foo, int, bool&gt; 设为 Foo 是声明 func 的类型,则可以省略 target(或传递 null)。

但是!!!请注意,就创建 lambda 表达式而言,拥有 Func&lt;int,bool&gt; 在很大程度上没有意义; lambda 表达式很少使用委托

【讨论】:

  • 出于好奇,您知道您使用的Delegate.CreateDelegate 和我在答案中输入的MethodInfo.CreateDelegate 之间是否有区别?
  • 你能澄清你最后一句话的意思吗,“但是……lambda 表达式很少使用委托。”
  • @hvd 在 .NET 4.5 之前,一个很大的区别:MethodInfo.CreateDelegate 不存在
  • @stakx 我将这里的上下文解释为与Expression 类型-表达式树有关。那些使用MethodInfo,而不是代表。
  • 哈,这是一个很好的区别。 :) 在这种情况下,我只会投票支持你的答案并删除我的答案。
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多