2014-06-30 94 views
0

我添加了兩個Web Services,它們在兩個不同的名稱空間中創建了幾個相同的類。例如:將一個類轉換爲另一個相同的類

namespace NS1 
{ 
    class SomeClass 
    { 
     ... 
    } 

    class AnotherClass 
    { 
     NS1.SomeClass SomeVariable = new NS1.SomeClass(); 
    } 
} 

namespace NS2 
{ 
    class SomeClass 
    { 
     ... 
    } 

    class AnotherClass 
    { 
     NS2.SomeClass SomeVariable = new NS2.SomeClass(); 
    } 
} 

是否有可能將NS1.AnotherClass轉換爲NS2.AnotherClass?或者更好的是,是否可以添加一個Web服務引用,以便它不重複其他已添加Web服務中已有的類?

+0

旁註:你可能要單獨問的第二個問題。 –

回答

3

不,儘管它們看起來很相似,但它們沒有什麼共同之處。編寫一個轉換器或共享一個接口或一個基類。

另一個選擇是編寫一個共享基類的包裝,很像System.Web.HttpContextWrapper,但它需要將所有要通過包裝類公開的方法進行通道化。 Resharper可以在這裏幫助。

1

不幸的是,如果不能彼此繼承(直接或間接),則不能將一個類轉換爲另一個類。

在您的特殊情況下(使用webservices),您可以強制嚮導創建一個相同的類(有一個複選框可重用現有的類)。

2

您可以使用WDSL.exe生成代理,而不是Visual Studio。 WSDL.EXE具有命令行開關共享類型:

/shareTypes 打開的類型共享功能。此功能爲 不同服務(名稱空間,名稱和連線簽名必須爲 相同)之間共享的相同類型創建一個代碼文件 ,並具有單一類型定義。以「http://」URL作爲命令行 參數引用服務或爲本地文件創建discomap文檔。當使用 /參數選項時,該值是該元素,並且是 ,無論是true還是false。

http://msdn.microsoft.com/en-us/library/7h3ystb6(vs.80).aspx

您可以從Visual Studio命令提示符訪問WSDL.EXE。一個例子命令如下所示:

wsdl.exe /sharetypes http://service1.com http://service2.com 

更新

如果你希望能夠使用Visual Studio跨Web服務共享類型和「添加服務引用」的方法,你可以這樣做與一個.disco文件。首先,您需要創建一個.disco文件,其中列出了您希望包含的所有WSDL文件的位置。這裏有一個例子:

<discovery xmlns="http://schemas.xmlsoap.org/disco/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <contractRef xmlns="http://schemas.xmlsoap.org/disco/scl/" ref="http://<url to wsdl1>"/> 
    <contractRef xmlns="http://schemas.xmlsoap.org/disco/scl/" ref="http://<url to wsdl2>"/> 
</discovery> 

接下來,在Visual Studio中添加服務引用對話框,你可以把路徑剛剛創建前綴爲「文件://」的.disco文件。因此,如果文件名爲service.disco保存在c:\ temp中,則可以使用file:// c:\ temp \ service.disco作爲地址。

+0

不錯,但它將課程重新命名爲例如「AnotherClass」和「AnotherClass1」等。 – arao6

+0

代碼中的兩個類型是否在同一個XML Namespace中?你使用asmx或wcf服務? –

+0

它們是我的硬盤上的兩個WSDL文件,從https://github.com/jzempel/fedex/tree/master/fedex/wsdls下載鏈接.disco文件中的本地文件可識別所有服務,但會創建每個服務的副本類。 – arao6

1

類似於「鴨打字」,我寫了一個「鴨複製」的方法:

public class DuckCopy 
{ 
    public static void CopyFields(object source, object target) 
    { 
     if (source == null) 
      throw new ArgumentNullException("source"); 
     if (target == null) 
      throw new ArgumentNullException("target"); 

     FieldInfo[] fiSource = source.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
     FieldInfo[] fiTarget = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
     foreach (FieldInfo fiS in fiSource) 
     { 
      foreach (FieldInfo fiT in fiTarget) 
      { 
       if (fiT.Name == fiS.Name) 
       { 
        fiT.SetValue(target, fiS.GetValue(source)); 
        break; 
       } 
      } 
     } 
    } 
} 

您可以使用它像

NS1.AnotherClass input = ...; 
NS2.AnotherClass output = new NS2.AnotherClass(); 
DuckCopy.CopyFields(input, output); 
相關問題