作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我刚刚在我们的应用程序中实现了一个 Command-CommandHandler 模式,该模式将命令对象添加到队列中;然后通过 CaSTLe Windsor 使用依赖注入(inject)以及通用方法来获取命令对象的相关处理程序。
命令界面是空白的,如下所示:
public interface ICommand
{
}
虽然 CommandHandler 接口(interface)是这样处理它的:
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
然后这些由我希望通过队列发送的命令实现;然后像这样通过 DependencyRegistration 包装器在 CaSTLe Windsor 中注册:
_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/
我是一名优秀的程序员,十分优秀!