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 .苹果一起…我想在我之前已经有人不辞辛苦地解决了这个问题。
再次感谢
当你创建一个服务引用时,你可以重用对象,这样它们就不会被再次构建(当然,你将失去自动生成的漂亮的东西)。
例如:服务器:[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的大量繁琐工作。