在运行时将Func <object,Task>转换为Func <T,Task>

Dav*_*fer 0 c# reflection

我有一个Func<object, Task>.我试图将它作为一个参数传递给一个需要的函数Func<T, Task>.我正在使用反射MethodInfo为函数创建一个函数,并且T直到运行时才会知道正在填充的函数.

我怎么能用反射做到这一点?

Luc*_*ski 5

并不需要做什么特别的事情.

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)