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

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

我也有一个Web服务,返回与Aboce.A非常相似的东西,所以现在我有一些内容:

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

我想做的是

myClientObj = (MyFramework.foo)myResponseObj

但是,它并不真正喜欢这个。说:“不能隐式将myframework.foo []转换为WebService.foo [

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

有帮助吗?

解决方案

如何提取接口(右键单击一个类,选择Rebactor->提取接口),然后将此接口应用于两个类?

因此,它看起来像:

namespace WebService
{
   public class foo : IExtractedInterface
}

namespace MyFramework
{
   public class foo : IExtractedInterface
}

然后,您应该能够做:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;

其他提示

两个对象都需要从相同的接口继承,以便成功执行您指定的铸件。您可能会考虑将所需的通用方法删除到可以在两个类中实现的接口,这样您就可以施放到接口类型,然后仅访问这些方法而不是整个对象。

享受!

您需要制作一种方法,通过手动复制所有属性,将一个类转换为另一个类。

然后,您可以在 Array.ConvertAll.

它们“基本上相同”是不够的。您只能在两个对象与类型兼容的对象之间进行铸造,这意味着它们共享一个共同的后代,而实际类型对于铸造有效。

例如,以下有效 CircleShape:

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

但是,以下将 不是 工作活动如果 ClassAClassB 具有完全相同的字段,但实际上并非彼此降临:

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

可能值得使他们既实现一个共同的界面,又可以施放到该界面并按照所需的方式使用它们。

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

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

不过,这是非常高级的.net-foo。

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

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

并且您的myframework.foo类在文件“ myframework foo.cs”中定义:如下:

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;

如果是一个数组,您提到的引用建议,则必须通过响应集合进行迭代,然后将成员对象添加到客户端集合中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top