Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#MethodInfo到具有泛型返回类型的可调用Func-表达式树_C#_Reflection - Fatal编程技术网

C#MethodInfo到具有泛型返回类型的可调用Func-表达式树

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

我正在尝试获取MethodInfo并将其转换为可调用的Func。我已经成功地使用同步函数with method signature实现了这一点:

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]'