在运行时(不是编译时)使用具有不同签名的委托包装委托

时间:2013-12-21 21:05:39

标签: c# reflection lambda delegates

我正在尝试包装一个lambda Func< bool>用Func< T,bool>其中T仅在运行时已知。我不打算实际发出使用该参数执行任何操作的代码,它将被忽略并且将调用包装的方法。

例如,如果我有:

Func<bool> innerFunc = () => true

在运行时我需要做这样的事情:

Type paramType = typeof (String); // or any other Type
Type wrappedFuncType = typeof (Func<,>).MakeGenericType (paramType, typeof (bool))
// this next line is close to what I want to do but isn't correct
Delegate wrappedFunc = Delegate.CreateDelegate (wrappedFuncType, this, innerFunc.Method);

我已经看到一些使用LambdaExpression.Compile的代码可能会起作用,但是因为这个代码是针对.NET 4.5,SL4 +,WP7 +,WinStore的PCL,它看起来不像它可用。

TL; DR

如何包装Func&lt; bool&gt;委托使它匹配像Func&lt; String,bool&gt;这样的东西并且对外部委托的调用返回内部委托的值?

更新 感谢@usr,我得到了这样的工作:

private static Func<T, bool> WrapFuncBool<T> (Func<bool> func)
{
    return _ => func ();
}

private Delegate CreateParameterizedFuncBoolDelegate (Type parameterType)
{
    var wrapMethodInfo = this.GetType().GetMethod ("WrapFuncBool", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod (parameterType);
    return (Delegate) wrapMethodInfo.Invoke (this, new object[] { (Func<bool>) (() => true) });
}

1 个答案:

答案 0 :(得分:2)

用C#编写包装器:

static Func<T, bool> Wrap<T>(Func<bool> f) {
 return _ => f();
}

现在使用反射(Wrap)来调用MakeGenericMethod