C# 无法将MyObject类型的对象强制转换为MyObject类型

C# 无法将MyObject类型的对象强制转换为MyObject类型,c#,web-services,C#,Web Services,在这种情况下,我在C#中使用的webservice方法返回一个业务对象,当使用以下代码调用webservice方法时,在web引用的reference.cs类中出现异常“无法将ContactInfo类型的对象强制转换为ContactInfo类型” 代码: ContactInfo contactInfo = new ContactInfo(); Contact contact = new Contact(); contactInfo = contact.Load(this.ContactID.V

在这种情况下,我在C#中使用的webservice方法返回一个业务对象,当使用以下代码调用webservice方法时,在web引用的reference.cs类中出现异常“无法将ContactInfo类型的对象强制转换为ContactInfo类型”

代码:

ContactInfo contactInfo = new ContactInfo();
Contact contact = new Contact();

contactInfo = contact.Load(this.ContactID.Value);

任何帮助都将不胜感激

这是因为其中一个
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
类:

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);
            }
        }
    }
}
名称空间MyClientProject
{
公共类MyClientClass
{
public void AskWebServiceForContactInfo()
{
使用(var service=new DoSomethingService())
{
MyClientProject.DoSomethingService.ContactInfo ContactInfo=service.GetContactInfo(1);
//我们实际上在这里得到了一个新对象,具有正确的名称空间
MyProject.ContactInfo localContactInfo=shallwcopy.Copy(ContactInfo);
}
}
}
}
注意

这仅仅是因为代理类和“真实”类具有完全相同的属性(一个由Visual Studio从另一个生成)。

您如何在web服务项目和使用者项目中引用该类?如果您只是使用了一个文件链接,这可以很好地解释错误的原因。serialiasation为.NET(我相信是Web服务或其他)工作的方式是使用反射加载/转储对象的数据。如果文件是简单链接的,那么它们实际上被编译为不同程序集中的不同类型,这就解释了为什么您有相同的名称,但不能在它们之间强制转换。我建议创建一个“核心”库,其中包含web服务和消费者项目引用,并包含您在任何地方都使用的
ContactInfo
类。

这不是问题,这是一个功能


他们是两个独立的班级。比较两者,注意代理类没有原始类中的构造函数、方法、索引器或其他行为。这与使用Java程序使用ASMX服务时发生的情况完全相同。

正如其他几个答案所建议的,这是因为.NET将它们视为两个不同的类。我个人建议使用类似的方法。我一直在用它,它看起来非常棒。您可以在1-2行代码中复制对象

Mapper.CreateMap<SourceClass, DestinationClass>();
destinationInstance = Mapper.Map<SourceClass, DestinationClass>(sourceInstance);
Mapper.CreateMap();
destinationInstance=Mapper.Map(sourceInstance);

似乎两端都有两个不同的类。您的应用程序有ContactInfo类,您的Web服务也有ContactInfo类。两者都是完全不同的两类。一种方法是在您这边使用WebService类。如果您在web服务中使用ContactInfo,那么它将被序列化,并可在客户端使用

实际上这不是一个bug。这是您自己的项目版本更改的问题! 因为您的最终运行不会在编译时使用原始导入的引用

例如,我制作了一个聊天服务器,客户端。我使用数据包结构在客户端项目上传输数据。 然后将相同的引用导入到服务器项目

当铸造
Packet Packet=(Packet)二进制格式化程序时,反序列化(流)我也犯了同样的错误。因为服务器项目的实际运行引用不是客户端项目的当前引用!因为我已经重建了很多次客户端项目之后

在强制转换
=()
时,新对象总是需要与旧对象更新或相同的版本

因此,我做的是构建一个单独的项目,为Packet类创建一个DLL,并将DLL文件导入两个项目

如果我对包类做了任何更改,我必须再次导入对客户端和服务器的引用


那么演员就不会有上述例外了

添加web引用时,还可以修改Visual Studio生成的References.cs文件。如果删除代理生成的类并向您的个人类添加引用(使用语句),您将能够直接使用它们,而无需浅拷贝/反射或重映射。(但如果重新生成代理层,则必须重新应用修改)

我还尝试序列化代理对象,并在DTO类中反序列化它们,但这相当耗费资源,因此我最终修改了cs生成的引用层

希望它能帮助其他来这里的人:)


好心。

你最近更新了你的网络参考资料吗?@Downvoter:想要有人关心你的想法吗?那你就得说出你的想法。“-2”没什么意思。相反,说出你为什么投了反对票。它不应该这样做。我们只有在使用生成的代理时才会遇到这个问题,而不是在使用CreateChannel方法时,但是我们的问题与本文相同。我不认为这是一项功能。@schmoopy:他使用的是ASMXWeb服务,而不是WCF。没有
CreateChannel
方法。