【问题标题】:invoke a Func<int,bool> by reflection通过反射调用 Func<int,bool>
【发布时间】:2011-03-23 15:12:50
【问题描述】:

我想将 lambdas 存储为对象并稍后使用反射执行它们。不管这样做有什么好处,我想知道如何得到类似下面的东西。

假设我有不同的功能定义为 -

Func<string,bool> f1 = (i)=>i == "100";
Func<int,bool> f2 = (i)=>i == 100;

如果我在运行时获得所有涉及的类型,我可以在运行时执行这些(我无法将对象强制转换为 Func 等,因为我不知道涉及哪些类型),我可以执行以下操作吗?

void RunFunc(Type param1, Type returnParam, object obj)
{
   Type funcType = typeof(Func<,>).MakeGenericType(param1,returnParam);
   var d = Delegate.CreateDelegate(funcType , obj,"Invoke");
   d.DynamicInvoke();
}

谢谢

【问题讨论】:

  • 在创建 o 或 f 之后,您永远不会使用它们。为什么不将 o 转换为 Func 并直接调用它?
  • 旁注 - Func 可以替换为 Predicate,我发现它更有意义。
  • 为什么将f 声明为Func&lt;string,bool&gt; 并将funcType 声明为Func&lt;int,bool&gt;?是故意的吗?

标签: c# generics reflection delegates


【解决方案1】:

当然可以。您只需要在提供适当类型的参数时调用DynamicInvoke

但是为什么要打扰呢?你可以做的更简单

Delegate del;

del = f1;
var result1 = del.DynamicInvoke("99");

del = f2;
var result2 = del.DynamicInvoke(100);

您可以将其中任何一个转换为Delegate,您甚至不需要知道参数的类型或调用它们的返回值(只需知道参数的数量)。当然,您需要知道返回值的类型才能使用它,但仅此而已。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多