我震惊地发现,这甚至无法编译。 这是我在WCF服务中编写的问题的测试程序(基本上客户端向wcf服务发送不同任务的列表,然后是服务器端处理,不同任务的列表,并且需要为每个任务运行不同的方法)。
编译错误:无法转换为' UserQuery.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();
}
答案 0 :(得分:4)
您必须明确地将obj
强制转换为MyObj1
,因为编译器不知道您将该类的实例分配给obj
。
IMyInterface obj = new MyObj1();
var s = Process((MyObj1) obj);
obj
的实际类型仅在运行时已知。
更好的appraoch将在您的界面本身定义方法Process
:
IMyInterface {
public string Process();
}
现在你的两个类通过以下方式实现:
class MyObj1 : IMyInterface {
public string Process() { return "did one" ; }
}
因此,您甚至不必将该实例传递给该方法。
答案 1 :(得分:0)
为什么不在type constraints使用开放式泛型?不需要铸造,不需要工厂类或任何 hacky 。
public string Process<T>(T obj)
where T : IMyInterface
{
...
}
称之为
IMyInterface obj = new MyObj1();
var s = Process(obj);
按预期。