【问题标题】:c# casting across different assemblies [closed]c#跨不同程序集的转换[关闭]
【发布时间】:2011-07-20 11:52:34
【问题描述】:

我正在参与一个大型项目。出于一些效率和代码整合的原因,我工作的公司决定将其部分代码转换为 Web 服务。我已经转换了一些代码以停止使用对项目内其他程序集的引用。现在代码现在使用我在项目中添加 Web 引用时生成的代码。

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

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

在组件 A 中使用的类对象的代码被调用,比如说苹果,例如 A,apple()

现在更改后,代码使用使用名为“Web”的自动生成的 web 服务类创建的对象,因此 Web.apple()

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

那么我如何让 c# 相信我他们确实是同一个东西并停止给我投射错误?

P.S 根据公司政策,我无法上传任何代码,但我认为这无关紧要,因为上面的示例应该可以解释这种情况。

提前致谢

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

我发现Apple有一个合并方法,我将Web.apple和A.apple合并在一起.. 我想在我之前有人遇到过解决这个问题的麻烦..

再次感谢

【问题讨论】:

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


    【解决方案1】:

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

    例如:

    服务器:

    [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 命名空间。

    【讨论】:

    • 谢谢,我会尽量匹配 evety 的东西
    【解决方案2】:

    我认为AutoMapper 是您正在寻找的。​​p>

    【讨论】:

    • 感谢您的宝贵时间,但不幸的是,公司不允许我技术上安装未经授权的软件,所以我希望更多的黑客能够在 c# 本身中实现这一点。如果我想不出任何东西我一定会试一试..再次感谢
    • 你不需要安装任何东西。只需下载 DLL 并在您的项目中引用它或下载 C# 文件并将它们直接包含到您的项目中。
    【解决方案3】:

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

    正如@Daniel Hilgarth 所建议的,您可能想要使用 AutoMapper。它使用规则来自动完成创建 DTO 过程中的许多繁琐工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多