我正在参与一个大型项目。出于某些效率和代码整合的原因,我工作的公司决定将其部分代码转移到 Web 服务中。我已经转换了一些代码以停止使用对项目内其他程序集的引用。现在,代码现在使用我将 Web 引用添加到项目时生成的代码。
问题是使用我修改的代码的组件提供从不同程序集构造的对象,而我从生成的代码创建/使用/返回对象。现在,即使对象是相同的,我也不能将它们相互转换。有没有办法强制强制转换,因为我关心的对象非常庞大,而且我不想编写自定义映射器或类似的东西。
问题的一个例子是:项目包含许多小组件 A、B、C...Z
代码在组件 A 中使用了类的对象,比如 apple,例如 A,apple()
现在,更改后,代码使用使用自动生成的名为“Web”的 Web 服务类创建的对象,即 Web.apple()
无论如何,后面的Web服务实际上引用了A.apple,因此Web.Apple和A.apple是同一件事。
那么我如何让 c# 相信我它们确实是同一件事并停止给我转换错误?
P.S 根据公司政策,我无法上传任何代码,但我认为这无关紧要,因为上面的示例应该解释这种情况。
提前致谢
非常感谢您的回答,这就是我最终所做的:
我发现Apple有一个合并方法,我将Web.apple和A.apple合并在一起。 我猜我之前的某个人已经费尽心思解决了这个问题..
再次感谢
最佳答案
当您创建服务引用时,您可以重用对象,这样它们就不会再次构建(当然,您将失去自动生成的漂亮东西)。
例如:
服务器:
[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 命名空间。
关于C# 跨不同程序集的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6761437/