c# - 通过泛型传递类类型而不是接口(interface)

标签 c# generics dependency-injection castle-windsor

好的,我刚刚在我们的应用程序中实现了一个 Command-CommandHandler 模式,它将命令对象添加到队列中;然后通过 CaSTLe Windsor 使用依赖注入(inject)以及通用方法来获取命令对象的相关处理程序。

命令界面是空白的,如下所示:

public interface ICommand
{
}

虽然 CommandHandler 接口(interface)是这样处理的:

public interface ICommandHandler<TCommand> where TCommand : ICommand
{
    void Handle(TCommand command);
}

然后这些由我希望通过队列发送的命令来实现;然后通过 DependencyRegistration 包装器在温莎城堡中注册,如下所示:

_dependencyRegister
    .AddRegistration<ICommandHandler<TestCommand>, TestCommandHandler>();

因此,将添加到队列中的每个命令都通过处理程序将 1 映射到 1;然后在温莎城堡注册;因此我们可以使用这样的通用方法来获取特定 Command 对象的相关 CommandHandler:

private void HandleCommand<T>(T queueItem) where T: ICommand
{
    var handler = _dependencyResolver.Resolve<ICommandHandler<T>>();

    handler.Handle(queueItem);
}

最后一部分是队列调度程序方法,如下所示:

private void DispatchQueueItem(ICommand queueItem)
{
    HandleCommand(queueItem);
}

对;问题是,当我将命令作为 ICommand 从队列中拉出并将其传递给 DispatchQueueItem 方法时;当它发送到 HandleCommand 方法时,“T”类型始终设置为“ICommand”接口(interface);而不是接口(interface)的实际实现(DependencyRegistration 示例代码中的 TestCommand)。

我的问题是;如何设置 HandleCommand 方法以获取实现的类型;不是界面?

最佳答案

将您的调度方法更改为通用:

private void DispatchQueueItem<T>(T queueItem)
    where T: ICommand
{
    HandleCommand(queueItem);
}

更新你可以强制 C# 以这种方式在运行时定义对象类型

private static void DispatchQueueItem(ICommand queueItem)
{
    HandleCommand((dynamic)queueItem);
}

关于c# - 通过泛型传递类类型而不是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10536132/

相关文章:

c# - .NET 中的 KeyValuePair 和 Hashtable 有什么区别?

C# 数据表 Entity Framework

c# - EmguCV 在查询高分辨率帧时性能非常差

java - 原始类型没有警告

java - 注入(inject)已注入(inject)实例的列表

c# - 在IE9中选择 'Open'时Asp.Net下载文件报错

java - 为什么我不能将 lambda 分配给未类型化的谓词引用?但是可以为它分配一个初始化的类型谓词引用吗?

java - Java 1.8.0_65 的推断类型问题

java - 有没有可能通过使用 Guice 来拦截这样的方法?

javascript - 配置一个从单元测试中的延迟返回 promise 的 stub 工厂?