gpt4 book ai didi

c# - 将对象转换为 Task 并从类型为 Type 的变量设置 T

转载 作者:行者123 更新时间:2023-12-03 23:00:47 26 4
gpt4 key购买 nike

解释起来有点困难,对此我深表歉意。但我需要帮助。
我正在研究事件的通用方法。我所有的代码都基于 eShopOnContainers example但我的处理程序应该返回一个值。
在 eShopOnContainers 中只有 Task作为返回类型,所以他们可以很容易

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 });
请帮助我,因为我不明白这是怎么可能的。先感谢您。
请让我知道我应该添加哪些信息以帮助您更好地理解。
摆弄代码以重现 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;

关于c# - 将对象转换为 Task<T> 并从类型为 Type 的变量设置 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65874446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com