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