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

时间:2014-06-30 21:10:50

标签: c# visual-studio

我添加了两个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服务中已存在的类?

4 个答案:

答案 0 :(得分:3)

没有。虽然它们看起来很相似,但这些类没有任何共同点。编写转换器或共享接口或基类。

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

答案 1 :(得分:2)

不幸的是,如果一个类不相互继承(直接或间接),则不能将其转换为另一个类。

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

答案 2 :(得分:2)

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

  

<强> / shareTypes   打开类型共享功能。此功能创建一个代码文件   对于共享的相同类型的单一类型定义   不同的服务(名称空间,名称和电线签名必须是   相同)。使用“http://”URL作为命令行引用服务   参数或为本地文件创建discomap文档。使用时   / parameters选项,这个值是元素而且是   无论是真还是假。

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“添加服务引用”对话框中,您可以放入前缀为“file://”的.disco文件的路径。因此,如果文件名为service.disco,保存在c:\ temp中,则使用 file:// c:\ temp \ service.disco 作为地址。

答案 3 :(得分:1)

与#34; duck typing&#34;类似,我写了一个&#34; duck copy&#34;方法:

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);