2

我真的被这个问题困住了:我在类中有一些数据,BigStorage 在 GUI 中有一些操作。我需要将此类中的数据传递给 Web 服务,然后接收答案并进行处理。

我已经编译了一个包含这个 BigStorage 类定义的 dll 并将它提供给我们的网络管理员 - 他使用了这个类并将结果返回给我。但是我收到了这个结果 webRefName.BigStorage,这不等于我的BigStorage(它们有不同的命名空间)。

顺便说一下,其中的一个私有字段webRefName.BigStoragetypeof DataSet(?!),当在我的 BigStorage 中它有我自己定义的类型(我已经为它添加了 xml 序列化)。

有没有办法执行以下操作:

webRefName.BigStorage bS = (webRefName.BigStorage) bSfromLocalProject;
 //where  bSfromLocalProject typeof BigStorage

另外,为什么 Reference.cs 中的这个字段(见上文)是 DataSet?

4

2 回答 2

3

从 Web 引用生成的类型是从可用的元数据 (wsdl) 生成的浅层代理类型。它们与原始类型不同,不能互换使用命名空间可以配置为 web-reference 属性的一部分,但使其相等不会使这个工作。

如果您在另一端使用原始程序集,请考虑使用Web 服务引用(即 WCF)。这可以选择重用现有类型,这意味着它可以使用现有 dll 引用中的类型。然后它们是完全可以互换的(或者更准确地说,它们是相同的东西——所以没有什么可以互换)。

于 2012-08-02T12:12:33.553 回答
0

在 C# 中,您不能(默认情况下)将不同的类型相互转换;但是,您可以在您有权访问的类中定义转换操作:如果您有权访问 Web 引用的类,那么自动生成的类应该是部分的,您可以扩展它;如果您可以访问该库,则向其添加转换操作方法(尽管我不建议为该库执行此操作 - 最好为 Web 引用的类执行此操作)。

基本上,为了能够使用您在问题中提供的代码,您可以在源类或目标类中定义显式或隐式转换。

参考 MSDN:显式转换隐式转换
在您的情况下,隐式转换似乎更合适,因为这种转换不容易发生数据丢失。

这看起来像这样:

namespace webRefName {
    public partial class BigSorage {
        public static implicit operator BigStorage(otherNamespace.BigStorage otherBigStorage) {
            //write conversion code from otherBigStorage to webRefName.BigStorage.
            //return the resulting webRefName.BigStorage.
        }
    }
}

顺便说一句,此代码必须驻留在引用 web 服务的同一程序集中,因为不能在不同的程序集中定义部分。

之后,您可以写出您所要求的内容(即使没有明确的演员表):

webRefName.BigStorage bS = bSfromLocalProject;

我希望这有帮助!
滕吉兹

于 2012-08-02T12:27:07.787 回答