【问题标题】:C# Type ConversionC# 类型转换
【发布时间】:2010-12-16 01:52:43
【问题描述】:

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

关于如何解决这个问题的任何想法?物体很大,它们基本相同。

【问题讨论】:

  • 如果它们足够相似,那么是否有可能放弃从 XSD 文件生成的类而只使用 Web 服务代理的类?

标签: c# casting boxing unboxing


【解决方案1】:

如何提取接口(右键单击一个类,选择Refactor->Extract Interface),然后将此接口应用于两个类?

所以它看起来像:

namespace WebService
{
   public class foo : IExtractedInterface
}

namespace MyFramework
{
   public class foo : IExtractedInterface
}

你应该能够做到:

IExtractedInterface myClientObj = (IExtractedInterface)myResponseObj;

【讨论】:

    【解决方案2】:

    两个对象都需要从同一个接口继承才能成功执行您指定的转换。您可能会考虑将所需的常用方法提取到可以在两个类中实现的接口中,这样您就可以转换为接口类型,然后只能访问这些方法而不是整个对象。

    享受吧!

    【讨论】:

      【解决方案3】:

      您需要创建一个方法,通过手动复制所有属性来将一个类转换为另一个类。

      然后您可以在Array.ConvertAll 中调用该方法。

      【讨论】:

      • 这就是我害怕/希望避免的。谢谢
      【解决方案4】:

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

      例如,如果CircleShape 的后代,则以下工作:

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

      但是,如果 ClassAClassB 具有完全相同的字段但实际上并非彼此继承,则以下事件将不起作用

      ClassA a = new ClassA();
      ClassB b = (ClassA)a;
      

      让它们都实现一个通用接口可能是值得的,然后您可以转换为该接口并以您想要的方式使用它们。

      【讨论】:

        【解决方案5】:

        这基本上是answered already。但是请注意,除了此处已回答的内容之外,.NET 4 的新“类型等效”功能还提供了一线希望:

        但是请注意,C# 4 将支持 结构类型的有限形式 接口。详情请见http://blogs.msdn.com/samng/archive/2010/01/24/the-pain-of-deploying-primary-interop-assemblies.aspx

        不过,这是相当高级的 .NET-foo。

        【讨论】:

          【解决方案6】:

          如果您使用标准 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;
          

          【讨论】:

            【解决方案7】:

            如果它是一个数组,正如您给出的报价所暗示的那样,那么您必须遍历响应集合并将成员对象添加到客户端集合中。

            【讨论】:

              猜你喜欢
              • 2012-02-23
              • 2011-01-22
              • 1970-01-01
              • 2015-11-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-17
              • 1970-01-01
              • 2015-11-17
              相关资源
              最近更新 更多