2014-06-30 62 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); 
相关问题