c#跨不同程序集的强制转换

本文关键字:转换 程序集 | 更新日期: 2023-09-27 18:02:57

我是一个大项目的一部分。出于效率和代码整合的考虑,我所在的公司决定将部分代码转移到web服务中。我已经转换了一些代码,以停止在项目内使用对其他程序集的引用。现在,代码现在使用了当我将web引用添加到项目时生成的代码。

问题是使用我修改的代码的组件提供从不同程序集构造的对象,而我从生成的代码创建/使用/返回对象。现在,即使对象是相同的,我也不能将它们相互转换。有没有办法强制转换,因为我关心的对象非常庞大,我不想写一个自定义映射器或类似的东西。

问题的一个例子是:项目包含许多小组件A,B,C…Z

代码在组件A中使用了类的对象,比如apple,例如A,apple()

修改后,代码使用使用自动生成的webservice类"Web"创建的对象,因此Web.apple()

后面的webservice实际上引用了A.apple,所以Web。Apple和A.apple是一回事。

那么我如何让c#相信它们确实是同一件事,并停止给我类型转换错误?

p。根据公司政策,我不能上传任何代码,但我认为这无关紧要,因为上面的例子应该解释了情况。

提前感谢

非常感谢你的回答,这是我最后所做的:

我发现苹果有一个合并方法,我合并了Web。苹果和a .苹果一起…我想在我之前已经有人不辞辛苦地解决了这个问题。

再次感谢

c#跨不同程序集的强制转换

当你创建一个服务引用时,你可以重用对象,这样它们就不会被再次构建(当然,你将失去自动生成的漂亮的东西)。

例如:

服务器:

[DataContract(Namespace = "http://abc.com/"]
public class Apple
{
    [DataMember]
    public bool IsEvil { get; set; }
    [IgnoreDataMember]
    public bool IsPoisoned { get; set; }
}
客户:

[DataContract(Namespace = "http://abc.com/"]
public class Apple
{
    [DataMember]
    public bool IsEvil { get; set; }
    [IgnoreDataMember]
    public bool ClientSideBool { get; set; }
}

两者在名称和名称空间上匹配,数据成员也匹配。如果包含服务引用的应用程序/程序集有对该对象的引用,它将不会重新编码。相反,它会重用它。当然,一切都必须匹配,包括XML名称空间、名称、数据成员需求、顺序、名称等。在添加服务引用之前,必须编译和引用包含Apple的外部程序集(或者必须重新引用服务引用)。

确保名称空间匹配的一个好方法是使用ContractNamespaceAttribute,它将CLR名称空间映射到XML名称空间。确保两个对象映射到相同的XML名称空间。

我想AutoMapper就是你要找的。

当您将web服务引用导入到任何其他应用程序时,. net将代表您创建客户端代理。它们可能看起来是相同的,但实际上它们是完全不同的类型。在这里,您将看到人们创建数据传输对象 (dto)只是为了执行映射。

正如@Daniel Hilgarth所建议的,您可能会想要使用AutoMapper。它使用规则来自动化创建dto的大量繁琐工作。