【问题标题】:Typecast classes类型转换类
【发布时间】:2012-11-20 17:53:50
【问题描述】:

我在不同的命名空间中有两个类,我需要进行类型转换。

如何在另一个类中键入一个类的转换对象。这两个类具有相同的方法和属性。

反射会起作用吗? 任何类的类型转换示例都会有所帮助。

【问题讨论】:

标签: c# class casting


【解决方案1】:

你不能直接从一种类型转换为另一种类型,你可以这样做:

  1. 手动映射
  2. 使用反射自动映射(因为属性名称相同)
  3. 使用AutoMapper

【讨论】:

    【解决方案2】:

    除非它们以某种方式相关,否则不能转换它们,例如,一个是另一个的基础。

    您可以通过多种不同方式从一个映射到另一个,其中一种是使用映射器,AutoMapper 是众所周知的一种

    https://github.com/AutoMapper/AutoMapper

    这将根据类成员名称从一个映射到另一个

    【讨论】:

      【解决方案3】:

      另一种解决方案(部分形式映射),以防类在任何方式中不相关,可以使用dynamic。 事件如果这太危险了,但可以被认为是可能的选项之一:

      namepsace A {
          public class NotRelatedA() {
             public void Run() {}
          }
      }
      
      namepsace B {
          public class NotRelatedB() {
             public void Run() {}
          }
      }
      
      
      dynamic dyn = new A.NotRelatedA();
      dyn.Run(); //Run A
      
      dyn = new B.NotRelatedB();
      dyn.Run(); //Run B, without changing and mapping anything
      

      重复一遍,这有点危险,当你离开安全的静态类型世界时,会跳入动态强大的混乱中,所以如果你使用它,请谨慎使用它。

      【讨论】:

        【解决方案4】:

        这些类有多少属性?它们是“手写”类吗?

        也许您不需要两个类,可以删除其中一个并在任何地方使用另一个?

        也许其中一个类可以派生自另一个?然后你只需要在基类中编写通用属性和方法。

        如果您需要两个不同的类,并且都不从另一个派生(这是允许“普通”强制转换(引用转换强制转换)的情况),您有多种选择:

        1. 为其中一个类编写一个构造函数重载,将另一个类的实例作为参数,或者
        2. 编写一个静态方法,将一个类的实例“转换”为另一种类型的新对象,或者
        3. 您可以写一个public static explicit operator ClassOne(ClassTwo ct) 来完成“翻译”。有了它,就可以使用标准的转换语法(例如(ClassOne)variable),或者
        4. 正如其他人所建议的那样,您可以使用映射工具,或编写自己的反射代码,以找到它们之间“相似”的属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-18
          • 2022-08-18
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          • 2010-11-07
          相关资源
          最近更新 更多