我有两个对象。对象A和对象B.
对象A是从多个XSD文件生成的类的实例。使用xsd.exe / c并编译它们。现在我有了我的新对象。
我也有一个Web服务,返回与对象A非常相似的东西。所以现在我有一些类似的东西:
WebService.foo myResponseObj = MyService.GetObject(inData);
MyFramework.foo myClientObj = new MyFramework.foo();
我想做的是这个
myClientObj = (MyFramework.foo)myResponseObj
然而,它并不是真的喜欢这个。说“不能隐式地将MyFramework.foo []转换为WebService.foo []
有关如何解决此问题的任何想法?对象非常大,基本相同。
答案 0 :(得分:3)
两个对象都需要从同一个接口继承才能成功执行您指定的强制转换。您可以考虑将所需的常用方法拉出到可以在两个类中实现的接口中,这样您就可以转换为接口类型,然后只访问那些方法而不是整个对象。 / p>
享受!
答案 1 :(得分:3)
如何提取界面(右键单击一个类,选择Refactor-> Extract Interface),并将此界面应用于这两个类?
所以它看起来像:
namespace WebService
{
public class foo : IExtractedInterface
}
和
namespace MyFramework
{
public class foo : IExtractedInterface
}
然后您应该能够:
IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;
答案 2 :(得分:1)
您需要创建一个方法,通过手动复制所有属性将一个类转换为另一个类。
然后,您可以在Array.ConvertAll
。
答案 3 :(得分:1)
他们“基本相同”是不够的。如果它们是类型兼容的,则只能在两个对象之间进行转换,这意味着它们共享一个公共后代,而实际类型对于转换是有效的。
例如,如果Circle
是Shape
的后代,则以下情况有效:
Shape x = new Circle();
Circle y = (Circle)x;
但是,如果ClassA
和ClassB
具有完全相同的字段但实际上并非彼此后裔,则以下不工作事件:
ClassA a = new ClassA();
ClassB b = (ClassA)a;
让它们实现一个通用接口可能是值得的,然后你可以转换到该接口并按照你想要的方式使用它们。
答案 4 :(得分:1)
这基本上是answered already。但请注意,除了这里已经回答的内容之外,.NET 4的新“Type Equivalence”功能还有一丝希望:
但请注意,C#4将支持a 有限形式的结构打字 接口。有关详细信息,请参阅http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx。
这是非常先进的.NET-foo。
答案 5 :(得分:1)
如果您使用标准的wsdl.exe工具来创建代理和支持类,那么我相信它会将代码生成为部分类。如果这是您的情况,那么您可以将自己的隐式转换运算符插入其中一种类型。例如,假设您在MyService \ foo.cs文件中定义了MyService.foo类,如下所示:
namespace MyService
{
public partial class foo
{
public string PropertyA { get; set; }
public string PropertyB { get; set; }
public string PropertyC { get; set; }
// ...
}
}
您在MyFramework \ foo.cs文件中定义了MyFramework.foo类,如下所示:
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;
答案 6 :(得分:0)
如果它是一个数组,你给出的引用建议,那么你必须遍历响应集合并将成员对象添加到客户端集合中。