C# 将一个类转换为另一个相同的类

C# 将一个类转换为另一个相同的类,c#,visual-studio,C#,Visual Studio,我添加了两个Web服务,它们在两个不同的名称空间中创建了几个相同的类。例如: namespace NS1 { class SomeClass { ... } class AnotherClass { NS1.SomeClass SomeVariable = new NS1.SomeClass(); } } namespace NS2 { class SomeClass { ...

我添加了两个Web服务,它们在两个不同的名称空间中创建了几个相同的类。例如:

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服务中已经存在的类?

否。尽管它们看起来相似,但这些类没有任何共同之处。编写转换器或共享接口或基类


另一种选择是编写一个共享基类的包装器,很像
System.Web.HttpContextWrapper
,但它需要通过包装器类挖掘所有要公开的方法。Resharper可以在这里提供帮助。

不幸的是,如果一个类不相互继承(直接或间接),则无法将它们强制转换为另一个类


在您的特定情况下(使用Web服务),您可以强制向导创建一个相同的类(有一个复选框可重用现有类)。

您可以使用WDSL.exe而不是Visual Studio生成代理。WSDL.exe具有用于共享类型的命令行开关:

/shareTypes 打开类型共享功能。此功能创建一个代码文件 使用一个类型定义来定义在两个服务器之间共享的相同类型 不同的服务(名称空间、名称和连接签名必须是 相同)。使用“http://”URL作为命令行引用服务 参数或为本地文件创建discomap文档。使用时 在/parameters选项中,此值是元素,并且 对或错

您可以从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文件的路径,该文件的前缀为“file://”。因此,如果文件名为service.disco,保存在c:\temp中,您将使用文件://c:\temp\service.disco作为地址。

与“duck typing”类似,我编写了一个“duck copy”方法:

你可以像这样使用它

NS1.AnotherClass input = ...;
NS2.AnotherClass output = new NS2.AnotherClass();
DuckCopy.CopyFields(input, output);

旁注:您可能想单独问第二个问题。很好,但它将类重命名为“AnotherClass”和“AnotherClass1”等。这两个类型在您的代码中是否在同一个XML命名空间中?您正在使用asmx或wcf服务吗?它们是我硬盘上的两个WSDL文件,通过链接.disco文件中的本地文件下载。该文件识别所有服务,但创建了每个类的副本。我将尝试使用这些WSDL文件。你能给我一个没有按预期命名的类的例子吗?谢谢!WebAuthenticationDetail是一个被重命名的类。
NS1.AnotherClass input = ...;
NS2.AnotherClass output = new NS2.AnotherClass();
DuckCopy.CopyFields(input, output);