我很惊讶这甚至没有编译。这是我在编写的 WCF 服务中遇到的问题的测试程序(基本上客户端向 wcf 服务发送不同任务的列表,然后服务器端处理不同任务的列表,并且需要为每个任务运行不同的方法)。
编译错误:无法从"用户查询.IMyInterface"转换为 'UserQuery.MyObj1'
public interface IMyInterface{};
public class MyObj1 : IMyInterface{};
public class MyObj2 : IMyInterface{};
public String Process(MyObj1 obj)
{
return "did one";
}
public String Process(MyObj2 obj)
{
return "did two";
}
void Main()
{
IMyInterface obj = new MyObj1();
var s = Process(obj);
s.Dump();
}
您必须
显式地将obj
转换为MyObj1
,因为编译器不知道您将该类的实例分配给obj
。
IMyInterface obj = new MyObj1();
var s = Process((MyObj1) obj);
obj
的实际类型仅在运行时已知。
更好的选择是两个定义Process
接口本身的方法:
IMyInterface {
public string Process();
}
现在,您的两个类通过以下方式实现这一点:
class MyObj1 : IMyInterface {
public string Process() { return "did one" ; }
}
因此,您甚至不必将该实例传递给该方法。
为什么不使用带有类型约束的开放泛型?不需要铸造,不需要工厂类或任何黑客
。public string Process<T>(T obj)
where T : IMyInterface
{
...
}
称呼它为喜欢
IMyInterface obj = new MyObj1();
var s = Process(obj);
如预期的那样。