gpt4 book ai didi

c# - 创建通用实例

转载 作者:太空狗 更新时间:2023-10-30 00:54:38 25 4
gpt4 key购买 nike

我有一个实现命令模式的 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);

帮忙吗?

最佳答案

O. R. Mapper 对我正在实现的接口(interface)所说的话,他先发制人,你可以将泛型类型转换为它,然后调用该方法。

  Command c = new PostStatCommand();
var genericType = typeof(AbstractCommandHandler<>).MakeGenericType(c.GetType());
ICommandHandler handler = (ICommandHandler)Activator.CreateInstance(genericType);
handler.HandleCommand(c);

使 AbstractCommandHandler 实现 ICommandHandler

 public class AbstractCommandHandler<T> : ICommandHandler
{
public void HandleCommand(Command c)
{
}
}

现在应该可以工作了

关于c# - 创建通用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com