C# 跨不同程序集的转换

标签 c# asp.net web-services casting assemblies

我正在参与一个大型项目。出于某些效率和代码整合的原因,我工作的公司决定将其部分代码转移到 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/

相关文章:

c# - ServiceContractGenerator CodeDomProvider 编译错误

c# - MediaPlayerLauncher 不起作用

asp.net - 在 web.config 中存储值 - appSettings 或 configSection - 哪个更有效?

c# - 如何在 IEnumerable<xxx.Models.xxx> 函数中返回自定义 HTTP 状态代码 + 消息

c# - C# 中的类和方法,这是一个好方法吗?

groovy - 从 groovy 脚本使用 Web 服务的问题

java - 减少 JAX-WS Web 服务中的数据流量

c# - 什么时候结构不在栈上?

c# - 在 C# 中将 RTF 文件转换为 PDF

c# - 在 VS17 中模拟时,无法让简单的主/详细模式 Xamarin.Forms 应用程序工作