gpt4 book ai didi

c# - 通用接口(interface)的运行时转换

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:56 25 4
gpt4 key购买 nike

我有一个命令处理例程,它需要从我的 IOC 容器中获取处理器对象并对其调用 ProcessCommand,处理器是实现通用接口(interface)的具体对象:

public interface ICommandProcessor<in T> where T : Command
{
Error ProcessCommand(T command);
}

我遇到的问题是,当我尝试检索处理器时,我只能通过基类 (Command) 引用命令对象,所以我不知道 T 的类型(运行时除外)

我介绍了第二个非通用接口(interface)

public interface ICommandProcessorGeneric
{

}

public interface ICommandProcessor<in T>:ICommandProcessorGeneric where T : Command
{
Error ProcessCommand(T command);
}

并且可以按如下方式从 IOC 容器中检索处理器:

 protected virtual CommandProcessingResult RecognizeAndProcessCommand<T>(T command) where T : Command
{
ICommandProcessor<T> commandProcessor;

try
{
Debug.WriteLine(String.Format( "---- Looking for processor for type {0}", command.GetType().Name));
var g = ServiceLocator.GetInstance<ICommandProcessorGeneric>(command.GetType().Name);
commandProcessor = g as ICommandProcessor<T>; //returns null!!
Debug.WriteLine(String.Format("---- Got Processor {0}", g.GetType().Name));
}
catch (Exception ex)
{
//handle the exception
}
return commandProcessor.ProcessCommand(command);
}

问题是 commandProcessor 为 null,因为 T 是 Command,而在运行时我知道 T 是派生类型。从 IOC 容器返回的对象 g 是正确的处理器,但是我看不出如何将 g 转换为允许我访问 ProcessCommand 方法的类型。

我还应该指出,调用此方法无法在编译时确定命令的类型,因为命令仅通过引用 ID 字段从数据库中检索并反序列化。

最佳答案

I've written a blog post on this very issue .

基本上我过去所做的就是为您的命令处理器创建一个抽象基类以及一个通用类:

public abstract class CommandProcessor
{
public abstract Error ProcessCommand(Command command);
}

public abstract class CommandProcessor<TCommand> where TCommand : Command
{
public override Error ProcessCommand(Command command)
{
if (command is TCommand == false)
throw new ArgumentException("command should be of type TCommand");

var cast = (TCommand)command;

return this.ProcessCommand(cast);
}

public abstract Error ProcessCommand(TCommand command);
}

现在你不需要根据你使用的命令类型做任何特殊的事情:

protected virtual CommandProcessingResult RecogniseAndProccessCommand<T>
(T command) where T : Command
{
var commandProcessor = (CommandProcessor)ServiceLocator.GetInstance<ICommandProcessorGeneric>(typeof(T).Name);

return commandProcessor.ProcessCommand(command);
}

关于c# - 通用接口(interface)的运行时转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490700/

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