0

我有两个对象。对象 A 和对象 B。

对象 A 是从多个 XSD 文件生成的类的实例。使用 xsd.exe /c 并编译它们。现在我有了我的新对象。

我还有一个 Web 服务,它返回与对象 A 非常相似的东西。所以现在我有一些类似的东西:

WebService.foo myResponseObj = MyService.GetObject(inData);
MyFramework.foo myClientObj = new MyFramework.foo();

我想做的是这个

myClientObj = (MyFramework.foo)myResponseObj

然而,它并不是真的喜欢这个。说“无法将 MyFramework.foo[] 隐式转换为 WebService.foo[]

关于如何解决这个问题的任何想法?物体很大,它们基本相同。

4

7 回答 7

3

两个对象都需要从同一接口继承才能成功执行您指定的转换。您可能会考虑将所需的公共方法提取到可以在两个类中实现的接口中,这样您就可以转换为接口类型,然后只能访问这些方法而不是整个对象。

享受!

于 2010-06-02T18:54:52.913 回答
3

提取接口怎么样(右键单击一个类,选择 Refactor->Extract Interface),然后将此接口应用于两个类?

所以它看起来像:

namespace WebService
{
   public class foo : IExtractedInterface
}

namespace MyFramework
{
   public class foo : IExtractedInterface
}

然后,您应该能够:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;
于 2010-06-02T18:55:33.783 回答
1

您需要通过手动复制所有属性来创建一个将一个类转换为另一个类的方法。

然后,您可以在Array.ConvertAll.

于 2010-06-02T18:54:33.723 回答
1

它们“基本相同”是不够的。如果它们是类型兼容的,则只能在两个对象之间进行转换,这意味着它们共享一个共同的后代并且实际类型对转换有效。

例如,如果Circle是 的后代,则以下内容有效Shape

Shape x = new Circle();
Circle y = (Circle)x;

但是,如果并且具有完全相同的字段但实际上不是彼此的后代,则以下事件将不起作用:ClassAClassB

ClassA a = new ClassA();
ClassB b = (ClassA)a;

让它们都实现一个通用接口可能是值得的,然后您可以转换为该接口并以您想要的方式使用它们。

于 2010-06-02T18:55:44.087 回答
1

这基本上已经回答了。但是请注意,除了此处已回答的内容外,.NET 4 的新“类型等效”功能还提供了一线希望:

但请注意,C# 4 将支持接口上有限形式的结构类型。有关详细信息,请参阅http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx

不过,这是非常先进的 .NET-foo。

于 2010-06-02T19:03:46.420 回答
1

如果您使用标准 wsdl.exe 工具来创建代理和支持类,那么我相信它会将代码生成为部分类。如果这是您的情况,那么您可以将自己的隐式转换运算符插入其中一种类型。例如,假设您在“MyService\foo.cs”文件中定义了 MyService.foo 类,如下所示:

namespace MyService
{
    public partial class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

您在“MyFramework\foo.cs”文件中定义了 MyFramework.foo 类,如下所示:

namespace MyFramework
{
    public class foo
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        // ...
    }
}

然后你可以创建一个单独的文件,比如“MyService\foo.conversion.cs”,如下所示:

namespace MyService
{
    partial class foo
    {
        public static implicit operator MyFramework.foo(foo input)
        {
            return new MyFramework.foo
            {
                PropertyA = input.PropertyA,
                PropertyB = input.PropertyB,
                PropertyC = input.PropertyC,
                // ...
            };
        }
    }
}

这将允许您使用 MyService.foo 对象编写大部分代码,就好像它是 MyFramework.foo 对象一样。以下代码使用上述设置编译:

        MyService.foo x = new MyService.foo();

        MyFramework.foo y = x;
于 2010-06-02T19:16:24.647 回答
0

如果它是您给出的报价所暗示的数组,那么您必须遍历响应集合并将成员对象添加到客户端集合中。

于 2010-06-02T18:57:24.967 回答