题
我有两个对象。对象A和对象B。
对象A是从几个XSD文件生成的类的实例。使用xsd.exe /c并编译了它们。现在我有了新的对象。
我也有一个Web服务,返回与Aboce.A非常相似的东西,所以现在我有一些内容:
WebService.foo myResponseObj = MyService.GetObject(inData);
MyFramework.foo myClientObj = new MyFramework.foo();
我想做的是
myClientObj = (MyFramework.foo)myResponseObj
但是,它并不真正喜欢这个。说:“不能隐式将myframework.foo []转换为WebService.foo [
关于如何解决这个问题的想法?物体很大,基本上是相同的。
解决方案
如何提取接口(右键单击一个类,选择Rebactor->提取接口),然后将此接口应用于两个类?
因此,它看起来像:
namespace WebService
{
public class foo : IExtractedInterface
}
和
namespace MyFramework
{
public class foo : IExtractedInterface
}
然后,您应该能够做:
IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;
其他提示
两个对象都需要从相同的接口继承,以便成功执行您指定的铸件。您可能会考虑将所需的通用方法删除到可以在两个类中实现的接口,这样您就可以施放到接口类型,然后仅访问这些方法而不是整个对象。
享受!
您需要制作一种方法,通过手动复制所有属性,将一个类转换为另一个类。
然后,您可以在 Array.ConvertAll
.
它们“基本上相同”是不够的。您只能在两个对象与类型兼容的对象之间进行铸造,这意味着它们共享一个共同的后代,而实际类型对于铸造有效。
例如,以下有效 Circle
是 Shape
:
Shape x = new Circle();
Circle y = (Circle)x;
但是,以下将 不是 工作活动如果 ClassA
和 ClassB
具有完全相同的字段,但实际上并非彼此降临:
ClassA a = new ClassA();
ClassB b = (ClassA)a;
可能值得使他们既实现一个共同的界面,又可以施放到该界面并按照所需的方式使用它们。
这基本上已经 已经回答了. 。但是请注意,除了这里回答的内容外,.NET 4的新“类型等价”功能提供了一小片希望:
但是请注意,C#4将支持在接口上的有限形式的结构键入形式。看 http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx 有关详细信息。
不过,这是非常高级的.net-foo。
如果您使用标准wsdl.exe工具来创建代理和支持类,那么我相信它将代码作为部分类生成。如果是您的情况,那么您可以将自己的隐式转换操作员插入其中一种类型。例如,假设您的myService.foo类在文件“ myService foo.cs”中定义的类别如下:
namespace MyService
{
public partial class foo
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
// ...
}
}
并且您的myframework.foo类在文件“ myframework foo.cs”中定义:如下:
namespace MyFramework
{
public class foo
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
// ...
}
}
然后,您可以创建一个单独的文件,假设“ myService foo.conversion.cs”如下:
namespace MyService
{
partial class foo
{
public static implicit operator MyFramework.foo(foo input)
{
return new MyFramework.foo
{
PropertyA = input.PropertyA,
PropertyB = input.PropertyB,
PropertyC = input.PropertyC,
// ...
};
}
}
}
这将使您可以使用myService.foo对象编写大多数代码,就像它是myFrameWork.foo对象一样。以上设置的以下代码编译:
MyService.foo x = new MyService.foo();
MyFramework.foo y = x;
如果是一个数组,您提到的引用建议,则必须通过响应集合进行迭代,然后将成员对象添加到客户端集合中。