将对象转换为 Task<T> 并从类型为 Type 的变量设置 T

Cast object to Task<T> and set T from variable with type Type

解释起来有点困难,对此我深表歉意。但我需要帮助。 我正在研究事件的通用方法。我所有的代码都基于 eShopOnContainers example 但我的处理程序应该 return 一个值。

在 eShopOnContainers 中只有 Task 作为 return 类型,所以他们可以很容易

var eventType = _subsManager.GetEventTypeByName(eventName);
var integrationEvent = JsonConvert.DeserializeObject(message, eventType);
var concreteType = typeof(IIntegrationEventHandler<>).MakeGenericType(eventType);
await (Task)concreteType.GetMethod("Handle").Invoke(handler, new object[] { integrationEvent });

假设我有

public interface IRequestMessageHandler<in TRequest, TReply>
    {
        Task<TReply> Handle(TRequest request);
    }

在我的例子中,我需要转换为 Task<T>。输入 T 存储在变量

Type concreteHandlerType = typeof(IRequestMessageHandler<,>).MakeGenericType(subscription.RequestType, subscription.ReplyType);
Type concreteReplyType = typeof(Task<>).MakeGenericType(subscription.ReplyType);

然后我需要将结果转换为 concreteReplyType

var reply = await (concreteReplyType)concreteType.GetMethod("Handle")?.Invoke(handler, new[] { integrationEvent });

请帮助我,因为我不明白这是怎么可能的。先感谢您。 请让我知道我应该添加哪些信息以帮助您更好地理解。

Fiddle 带有重现代码 https://dotnetfiddle.net/X3m4A1

要解决您的问题,一个简单的解决方案是使用 dynamic(参见 here)。

var method = concreteType.GetMethod("Handle");
var task = (Task)method.Invoke(handler, new object[] { integrationEvent });

await task;

object result = ((dynamic)task).Result;