C#MethodInfo到具有泛型返回类型的可调用Func-表达式树
我正在尝试获取MethodInfo并将其转换为可调用的Func。我已经成功地使用同步函数with method signature实现了这一点:C#MethodInfo到具有泛型返回类型的可调用Func-表达式树,c#,reflection,C#,Reflection,我正在尝试获取MethodInfo并将其转换为可调用的Func。我已经成功地使用同步函数with method signature实现了这一点: public AnyObject MyFuncName(AnotherObject message, IMessage messageMetadata) 其中,AnyObject和另一个object就是任何类。在使用反射提取MethodInfo后,我使用以下代码完成了此操作: public static Func<Handler, objec
public AnyObject MyFuncName(AnotherObject message, IMessage messageMetadata)
其中,AnyObject
和另一个object
就是任何类。在使用反射提取MethodInfo后,我使用以下代码完成了此操作:
public static Func<Handler, object, IMessage, object> CompileHandler(Type handler, MethodInfo method, Type argumentType)
{
var instance = Expression.Parameter(typeof(Handler), "instance");
var messageParam = Expression.Parameter(typeof(object), "message");
var messageMetaParam = Expression.Parameter(typeof(IMessage), "messageMetadata");
var methodCall = Expression.Call(
Expression.Convert(instance, handler),
method,
Expression.Convert(messageParam, argumentType),
Expression.Convert(messageMetaParam, typeof(IMessage)));
return Expression.Lambda<Func<Handler, object, IMessage, object>>(
methodCall,
instance,
messageParam,
messageMetaParam).Compile();
}
但是,当Func签名为Func
编辑:这里的问题是如何实现上述功能?您可以通过自己的方法传递返回值以转换结果
私有静态异步任务展开(任务任务)=>等待任务;
...
表情,打电话(
新函数(展开)。方法
.GetGenericMethodDefinition()
.MakeGenericMethod(typeof(…),
方法调用
)
但听起来你解决了一个错误的问题。您的处理程序可能应该是泛型的。也许是这样
公共抽象类处理程序{
公共抽象任务InvokeHandler(对象消息);
}
公共抽象类处理程序:处理程序{
公共抽象对象HandleMessage(M message);
公共虚拟任务HandleMessageAsync(M消息)
=>Task.FromResult(HandleMessage(message));
公共覆盖任务InvokeHandler(对象消息)
=>HandleMessageAsync((M)消息);
}
现在,主循环可以调用任何
处理程序。InvokeHandler
,而所有类型转换都发生在抽象泛型基类型中。并且没有任何运行时编译。您可以编辑您的问题标题,在这里总结您试图解决的问题吗?有关详细信息,请参阅。您不能将任务
强制转换为任务
,但可以编写一个助手异步方法,该方法接受任务
,并返回一个任务
,然后在表达式中调用它。@JeremyLakeman您有任何示例代码可以帮助我更好地理解这一点吗?谢谢你的回复!
Initialization method HandlerUnitTests.TestInitialize
threw exception. System.ArgumentException: System.ArgumentException: Expression of type
'System.Threading.Tasks.Task`1[Handler.AnyObject]' cannot be used for return type
'System.Threading.Tasks.Task`1[System.Object]'