我有一个实现命令模式的 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);帮助? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 为什么不直接通过反射调用 HandleCommand 呢?var handler = Activator.CreateInstance(handlerType);handlerType.GetMethod("HandleCommand").Invoke(handler, new [] {command});或者,创建一个非通用基类(接口(interface)也可以):public abstract class AbstractCommandHandler{ public abstract void HandleCommand(Command command);}public abstract class AbstractCommandHandler<T> : AbstractCommandHandler{ public override void HandleCommand(Command command) { HandleCommand((T) command); } public abstract void HandleCommand(T command);}public class StatCommandHandler : AbstractCommandHandler<PostStatCommand>{ public override void HandleCommand(PostStatCommand command) { }}并在您的 RunCommand 方法中:var handler = Activator.CreateInstance(handlerType);((AbstractCommandHandler)handler).HandleCommand(command);关于c# - 创建泛型实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12216235/ (adsbygoogle = window.adsbygoogle || []).push({});
10-08 23:15