我正在尝试开发一个通用命令处理器.我想创建实现给定接口的命令处理程序类.我将使用控制反转来根据接收到的命令类型动态创建相应类的实例.然后我想以通用的方式调用类的“Execute”方法.
我能够使用协变类型参数来完成这项工作,但在这种情况下,我不能使用泛型类型参数作为方法参数.
似乎逆变方法应该起作用,因为它允许我根据需要声明方法参数,但不幸的是,类的实例无法转换为基本接口.
下面的代码举例说明了这个问题:
using System; using System.Diagnostics; namespace ConsoleApplication2 { // Command classes public class CommandMessage { public DateTime IssuedAt { get; set; } } public class CreateOrderMessage : CommandMessage { public string CustomerName { get; set; } } // Covariant solution public interface ICommandMessageHandler1<out T> where T : CommandMessage { void Execute(CommandMessage command); } public class CreateOrderHandler1 : ICommandMessageHandler1<CreateOrderMessage> { public void Execute(CommandMessage command) { // An explicit typecast is required var createOrderMessage = (CreateOrderMessage) command; Debug.WriteLine("CustomerName: " + createOrderMessage.CustomerName); } } // Contravariant attempt (doesn't work) public interface ICommandMessageHandler2<in T> where T : CommandMessage { void Execute(T command); } public class CreateOrderHandler2 : ICommandMessageHandler2<CreateOrderMessage> { public void Execute(CreateOrderMessage command) { // Ideally,no typecast would be required Debug.WriteLine("CustomerName: " + command.CustomerName); } } class Program { static void Main(string[] args) { var message = new CreateOrderMessage {CustomerName = "Acme"}; // This code works var handler1 = new CreateOrderHandler1(); ICommandMessageHandler1<CreateOrderMessage> handler1b = handler1; var handler1c = (ICommandMessageHandler1<CommandMessage>) handler1; handler1c.Execute(message); // This code throws InvalidCastException var handler2 = new CreateOrderHandler2(); ICommandMessageHandler2<CreateOrderMessage> handler2b = handler2; var handler2c = (ICommandMessageHandler2<CommandMessage>)handler2; // throws InvalidCastException handler2c.Execute(message); } } }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。