1

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

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

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

4

4 回答 4

2

您不能直接从一种类型转换为另一种类型,您可以执行以下操作:

  1. 手动映射
  2. 使用反射自动映射(因为属性名称相同)
  3. 使用自动映射器
于 2012-12-03T09:31:36.160 回答
1

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

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

https://github.com/AutoMapper/AutoMapper

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

于 2012-12-03T09:31:36.460 回答
0

如果类不以任何方式相关,另一种解决方案(零件形式映射)可以使用. 事件如果这太危险了,但可以被视为可能的选项之一: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

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

于 2012-12-03T09:32:06.750 回答
0

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

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

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

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

  1. 为其中一个类编写一个构造函数重载,该类将另一个类的实例作为参数,或者
  2. 编写一个静态方法,将一个类的实例“翻译”为另一种类型的新对象,或者
  3. 你可以写一个public static explicit operator ClassOne(ClassTwo ct)做“翻译”的。这样,就可以使用标准的强制转换语法(即 say (ClassOne)variable),或者
  4. 正如其他人所建议的那样,您可以使用映射工具,或者编写自己的反射代码来查找“看起来相似”的属性,并在它们之间进行转换。
于 2012-12-03T09:49:59.690 回答