gpt4 book ai didi

c# - 在实现通用接口(interface)的动态对象上调用方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:55 25 4
gpt4 key购买 nike

我有一个查询对象,它来自服务总线,从 JSON 反序列化 - 看起来它正在工作......

public TResult Execute<TResult>(IQuery<TResult> query) where TResult : class {
....
var types = Assembly.GetExecutingAssembly().GetTypes();
var queryType = types.FirstOrDefault(z => z.Name.Equals(message.MessageType));
var queryObj = JsonConvert.DeserializeObject(message.Json, queryType, settings);

然后我想将它与已为其类型注册的处理程序相匹配(找到实现 TResult IQueryHandler 的方法)- 很好。 TResult 的唯一限制是它是一个类。

var handlerType = typeof(IQueryHandler<,>);
var genericType = handlerType.MakeGenericType(new[] { queryType, typeof(TResult) });
var handler = (dynamic)Startup.SimpleInjector.Instance.GetInstance(genericType);

然后我想用我重建的查询对象调用这个处理程序的 Handle 方法,但这就是我得到的地方:

result = handler.Handle(queryObj);
Log.Instance.Info("result {0}", result);

An exception occurred, MassTransit.Exceptions.RequestException: The response handler threw an exception ---> Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: The best overloaded method match for 'HomeApi.Handlers.Workflow.AnyWorkflowsStartWithEventQueryHandler.Handle(HomeApi.Queries.AnyWorkflowsStartWithEventQuery)' has some invalid arguments

我已经验证处理程序是从 SimpleInjector 返回的(尽管将其转换为动态会导致这里出现问题?)并且处理程序接受查询并返回预期的 TResult 所以不确定为什么我得到这个结果。任何帮助表示赞赏。

这里是 IQueryHandler 的定义<,>

public interface IQueryHandler<T, out TR> where T : class where TR : class
{
TR Handle(T query);
}

和 IQuery:

public interface IQuery<T> where T : class
{
string Type { get; }
}

最佳答案

假设JsonConvert.DeserializeObject(message.Json, queryType, settings);返回 object ,你实际上想调用 Handle与真实类型一起使用,例如:

result = handler.Handle((dynamic)queryObj);

现在,您正在调用 handler.Handle<MyRealType>(object) .

关于c# - 在实现通用接口(interface)的动态对象上调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830643/

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