在运行时将Func <object,task =“”>转换为Func <t,task =“”>

时间:2015-08-12 20:21:09

标签: c# reflection

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

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

2 个答案:

答案 0 :(得分:5)

你不 需要做任何特别的事情。

T上的Func<in T, out TResult>object - 它的输入参数,每个类型都继承自Func<object, Task>,这意味着您只能强制转换 { {1}} Func<T, Task> 任何引用类型 T - 按原样传递它,它就可以正常工作。

contravariant

现在,这对价值类型不起作用,因为那些事先需要拆箱

因此,如果您的T是值类型,则必须将其包装在将执行转换的另一个委托中。

一种简单的方法是定义包装器方法:

private static Func<T, TResult> CastFunc<T, TResult>(Func<object, TResult> fn)
    => param => fn(param);

然后通过反射创建一个委托:

var result = (Func<int, Task>)typeof(WrapperClass)
    .GetMethod(nameof(CastFunc), BindingFlags.NonPublic | BindingFlags.Static)
    .MakeGenericMethod(typeof(int), typeof(Task)).Invoke(null, new object[] { fn });

答案 1 :(得分:1)

我会使用setup(), processResponse(), isResponseAvailable(), getSavedResponse(), and setSavedResponse()

进行反思

这是一个简单的例子:

MakeGenericMethod