Это связано с тем, что один из объектов ContactInfo
является прокси-сервером веб-службы и находится в другом пространстве имен.
Это известная проблема с веб-сервисами в стиле asmx. В прошлом я использовал автоматическое мелкое копирование, чтобы обойти это (, вот как , хотя, если бы я делал это снова, я бы, вероятно, посмотрел на AutoMapper ).
Например, если у вас есть сборка со следующим классом:
MyProject.ContactInfo
и вы возвращаете его экземпляр из веб-метода:
public class DoSomethingService : System.Web.Services.WebService
{
public MyProject.ContactInfo GetContactInfo(int id)
{
// Code here...
}
}
Затем, когда вы добавляете веб-ссылку на ваш клиентский проект, вы фактически получаете это:
MyClientProject.DoSomethingService.ContactInfo
Это означает, что если в вашем клиентском приложении вы вызываете веб-службу для получения 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
класс:
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);
}
}
}
}
Примечание
Это работает только потому, что прокси-класс и «настоящий» класс имеют абсолютно одинаковые свойства (одно генерируется из другого Visual Studio).