2010-06-02 204 views
0

我有兩個對象。對象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

回答

3

如何提取界面(右鍵單擊一個類,選擇Refactor-> Extract Interface),並將這個界面應用於這兩個類?

所以它看起來像:

namespace WebService 
{ 
    public class foo : IExtractedInterface 
} 

namespace MyFramework 
{ 
    public class foo : IExtractedInterface 
} 

然後,您應該能夠做到:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj; 
1

任何想法,通過手動複製所有屬性的一類到另一個轉換。

然後,您可以調用該方法在Array.ConvertAll

+0

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

3

兩個對象都需要從相同的接口繼承爲了成功地執行你的投指定。你可能會看看拉出常用的方法喲你需要一個可以在兩個類中實現的接口,這樣你可以轉換爲接口類型,然後訪問這些方法而不是整個對象。

享受!

1

他們是 「基本一致」 是不夠的。只能在兩個對象之間進行投射,如果它們是類型兼容的,這意味着它們共享一個共同的後代並且實際類型對於投射是有效的。

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

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

然而,下面將工作相關的活動,如果ClassAClassB有相同的字段,但實際上並沒有從下降彼此:

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

它可能是值得的,使他們都實現了一個通用的接口,然後你可以轉換爲該接口並以您想要的方式使用它們。

0

如果它是一個數組,您給出的引用建議,那麼您必須遍歷響應集合並將成員對象添加到客戶機集合中。

1

如果您使用標準的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;