这是因为其中之一ContactInfo
对象是一个 Web 服务代理,并且位于不同的命名空间中。
这是 asmx 风格的 Web 服务的一个已知问题。过去我已经实现了自动浅复制来解决这个问题(就是这样,虽然如果我再做一次,我可能会看看自动映射器反而)。
例如,如果您有一个具有以下类的程序集:
MyProject.ContactInfo
然后从 Web 方法返回它的实例:
public class DoSomethingService : System.Web.Services.WebService
{
public MyProject.ContactInfo GetContactInfo(int id)
{
// Code here...
}
}
然后,当您将 Web 引用添加到客户端项目时,您实际上会得到以下结果:
MyClientProject.DoSomethingService.ContactInfo
这意味着,如果在您的客户端应用程序中,您调用 Web 服务来获取ContactInfo
,你有这样的情况:
namespace MyClientProject
{
public class MyClientClass
{
public void AskWebServiceForContactInfo()
{
using (var service = new DoSomethingService())
{
MyClientProject.DoSomethingService.ContactInfo contactInfo = service.GetContactInfo(1);
// ERROR: You can't cast this:
MyProject.ContactInfo localContactInfo = contactInfo;
}
}
}
}
我在最后一行使用了我的ShallowCopy
class:
namespace MyClientProject
{
public class MyClientClass
{
public void AskWebServiceForContactInfo()
{
using (var service = new DoSomethingService())
{
MyClientProject.DoSomethingService.ContactInfo contactInfo = service.GetContactInfo(1);
// We actually get a new object here, of the correct namespace
MyProject.ContactInfo localContactInfo = ShallowCopy.Copy<MyClientProject.DoSomethingService.ContactInfo, MyProject.ContactInfo>(contactInfo);
}
}
}
}
NOTE
这只有效,因为代理类和“真实”类具有完全相同的属性(一个是由 Visual Studio 从另一个生成的)。