コマンド パターンを実装する WCF サービスがあります。リフレクションを使用して、キーがコマンド タイプで、値が CommandHandler であるディクショナリを作成しました。アイデアは、WCF からコマンドを受け取り、ディクショナリを使用してハンドラーの型を取得し、アクティベーターを使用してハンドラーのインスタンスを作成することです。
public CommandResponse RunCommand(Command command)
{
_logger.Trace("Running Command");
var handlerType = HandlerMap[command.GetType()];
var handler = (AbstractCommandHandler<>)Activator.CreateInstance(handlerType);
handler.HandleCommand(command);
return new PostStatCommandResponse();
}
public class StatCommandHandler : AbstractCommandHandler<PostStatCommand>
{
public override void HandleCommand(PostStatCommand command)
{
}
}
問題は、Activator.CreateInstance が厳密に型指定されたコマンド ハンドラではなく、オブジェクトを返すことです。HandleCommand を呼び出せるようにする必要がありますが、それをベースの AbstractCommandHandler<> にキャストする方法がわかりません。
// Syntax error. Gotta provide type to generic
(AbstractCommandHandler<>)Activator.CreateInstance(handlerType);
// Casting error at run time
(AbstractCommandHandler<Command>)Activator.CreateInstance(handlerType);
// This is dumb and defeats the purpose.
(AbstractCommandHandler<PostStatCommand>)Activator.CreateInstance(handlerType);
ヘルプ?