我有一个Func<object, Task>.我试图将它作为一个参数传递给一个需要的函数Func<T, Task>.我正在使用反射MethodInfo为函数创建一个函数,并且T直到运行时才会知道正在填充的函数.
我怎么能用反射做到这一点?
你并不需要做什么特别的事情.
Func<in T, out TResult>是逆变上T-它的输入参数,每一个类型的继承object,这意味着你可以直接投 Func<object, Task>给Func<T, Task>供任何引用类型 T -把它作为-是,它只是工作.
现在,这不适用于值类型,因为它们需要事先取消装箱.
因此,如果您T是值类型,则必须将其包装在另一个将执行强制转换的委托中.
一种简单的方法是定义包装器方法:
private static Func<T, TResult> CastFunc<T, TResult>(Func<object, TResult> fn)
=> param => fn(param);
Run Code Online (Sandbox Code Playgroud)
然后通过反射创建一个委托:
var result = (Func<int, Task>)typeof(WrapperClass)
.GetMethod(nameof(CastFunc), BindingFlags.NonPublic | BindingFlags.Static)
.MakeGenericMethod(typeof(int), typeof(Task)).Invoke(null, new object[] { fn });
Run Code Online (Sandbox Code Playgroud)