実装するクラスがあります
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)に正常にキャストされ、呼び出されます。
更新:上記のコードは正しく、機能するはずです。私のプログラムでは、単にタイプミスがあり、間違ったオブジェクトでメソッドを呼び出していました。