C#类型转换

时间:2010-06-02 18:50:10

标签: c# casting boxing unboxing

我有两个对象。对象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 []

有关如何解决此问题的任何想法?对象非常大,基本相同。

7 个答案:

答案 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)

他们“基本相同”是不够的。如果它们是类型兼容的,则只能在两个对象之间进行转换,这意味着它们共享一个公共后代,而实际类型对于转换是有效的。

例如,如果CircleShape的后代,则以下情况有效:

Shape x = new Circle();
Circle y = (Circle)x;

但是,如果ClassAClassB具有完全相同的字段但实际上并非彼此后裔,则以下工作事件:

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)

如果它是一个数组,你给出的引用建议,那么你必须遍历响应集合并将成员对象添加到客户端集合中。