【发布时间】:2014-11-09 16:54:05
【问题描述】:
我有一个从服务总线传入的查询对象,从 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; }
}
【问题讨论】:
标签: c# dynamic reflection