我有一个实现的类
class MessageBus
{
void Subscribe<T>(Func<T,Task> onMessage) {...}
}
在我的代码中,我想动态订阅几种不同的消息类型。例如,我有消息类型:
class Message {}
class MessageA : Message {}
class MessageB : Message {}
我写了类似这样的代码:
class MySubscriber
{
void Initialize()
{
var mb = new MessageBus();
var mbt = mb.GetType();
var subscribeGeneric = mbt.GetMethods().First(x => x.Name == "Subscribe" && x.GetParameters().Length == 1);
var subscribeConcrete = subscribeGeneric.MakeGenericMethod(typeof(Message1));
subscribeConcrete.Invoke(mb, new object[]{ new Func<Message1,Task>(Handle) });
// On this line I get exception TargetException("Type does not meet target type"). Message my be a bit different, on my system I see it in Russian.
}
Task Handle(Message msg) {}
}
当然,在这个例子中,通过反射调用是没有意义的,但在实际程序中,我动态地得到 typeof(Message1),并且得到这些类型的数组。我究竟做错了什么?如果正常写入,它可以工作(即 Handle(Message) 成功转换为 Handle(Message1) 并被调用。
更新:所以上面的代码是正确的并且应该可以工作。在我的程序中,我只是有一个错字,并且在错误的对象上调用了该方法。