我有Func<object, Task>
。我试图将它作为参数传递给一个带Func<T, Task>
的函数。我使用反射为函数创建MethodInfo
,并且直到运行时才知道正在填充的T
。
我怎样才能用反射做到这一点?
答案 0 :(得分:5)
你不 需要做任何特别的事情。
T
上的Func<in T, out TResult>
是object
- 它的输入参数,每个类型都继承自Func<object, Task>
,这意味着您只能强制转换 { {1}} Func<T, Task>
任何引用类型 T
- 按原样传递它,它就可以正常工作。
现在,这对价值类型不起作用,因为那些事先需要拆箱。
因此,如果您的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