C#类型转换

问题描述:

我有两个对象。对象A和对象B.C#类型转换

对象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 []

你需要做的方法对如何解决这个问题?对象是相当大的,他们基本上是相同的。

+0

如果他们足够相似,那么是不是放弃从XSD文件生成的类,只是使用Web服务代理的类,而不是一个可能性? – 2010-06-02 18:56:48

如何提取界面(右键单击一个类,选择Refactor-> Extract Interface),并将这个界面应用于这两个类?

所以它看起来像:

namespace WebService 
{ 
    public class foo : IExtractedInterface 
} 

namespace MyFramework 
{ 
    public class foo : IExtractedInterface 
} 

然后,您应该能够做到:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj; 

任何想法,通过手动复制所有属性的一类到另一个转换。

然后,您可以调用该方法在Array.ConvertAll

+0

这就是我害怕/希望避免的。谢谢 – 2010-06-02 18:59:51

两个对象都需要从相同的接口继承为了成功地执行你的投指定。你可能会看看拉出常用的方法哟你需要一个可以在两个类中实现的接口,这样你可以转换为接口类型,然后访问这些方法而不是整个对象。

享受!

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

例如,如果Circle以下作品是Shape后裔:

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

然而,下面将工作相关的活动,如果ClassAClassB有相同的字段,但实际上并没有从下降彼此:

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

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

如果它是一个数组,您给出的引用建议,那么您必须遍历响应集合并将成员对象添加到客户机集合中。

这基本已经answered already。但是请注意,这除了什么已经在这里找到答案,有一个由.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;