我正在尝试包装一个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) });
}
答案 0 :(得分:2)
用C#编写包装器:
static Func<T, bool> Wrap<T>(Func<bool> f) {
return _ => f();
}
现在使用反射(Wrap
)来调用MakeGenericMethod
。