【发布时间】:2012-09-26 09:01:05
【问题描述】:
我卡住了,为什么这不起作用:
var childAction = new Action<CancelCommand>(blabla);
Action<IDomainCommand> upperAction = (Action<IDomainCommand>) childAction;
如果 CancelCommand 实现了 IDomainCommand,为什么这不起作用? 顺便说一句:这是我在这里想要做的协变还是逆变? ;)
提前谢谢你 就是最好的 月桂酸
编辑 谢谢你们的快速回复!
我需要这个的问题是因为我构造了一个通用的动作模板。 我有以下界面:
IMessageBus.RegisterAction<T>(Action<T> registerAction) where T : IDomainCommand
因为我必须在运行时构建此操作,所以我的代码如下所示:
var genericExecuteAction = this.GetType().GetMethod("ExecuteCommandAction",
BindingFlags.NonPublic | BindingFlags.Instance).MakeGenericMethod(commandType);
var actionType = typeof(Action<>).MakeGenericType(commandType);
var @delegate = Delegate.CreateDelegate(actionType, this, genericExecuteAction);
var actionDelegate = (Action<DomainCommandBase>)@delegate;
messageBus.Register(actionDelegate);
问题是我需要转换它,以便我可以将它传递给这个方法。 你看? 我们使用的消息总线背后是使用 RX,不幸的是那里的所有方法都使用泛型,现在有一个非泛型重载。
【问题讨论】:
-
协方差和反方差仅适用于接口,不适用于委托。
-
@Enigmativity:它也适用于代表。
-
谢谢你,我找到了答案:我只需要通过反射调用注册方法,而不是强制转换它 =)
标签: c#