【发布时间】:2012-11-20 17:53:50
【问题描述】:
我在不同的命名空间中有两个类,我需要进行类型转换。
如何在另一个类中键入一个类的转换对象。这两个类具有相同的方法和属性。
反射会起作用吗? 任何类的类型转换示例都会有所帮助。
【问题讨论】:
-
您不能投射,因为它们没有任何关系。这是AutoMapper 之类的工作。
-
我认为您正在寻找 mapping,而不是 casting。
我在不同的命名空间中有两个类,我需要进行类型转换。
如何在另一个类中键入一个类的转换对象。这两个类具有相同的方法和属性。
反射会起作用吗? 任何类的类型转换示例都会有所帮助。
【问题讨论】:
你不能直接从一种类型转换为另一种类型,你可以这样做:
【讨论】:
除非它们以某种方式相关,否则不能转换它们,例如,一个是另一个的基础。
您可以通过多种不同方式从一个映射到另一个,其中一种是使用映射器,AutoMapper 是众所周知的一种
https://github.com/AutoMapper/AutoMapper
这将根据类成员名称从一个映射到另一个
【讨论】:
另一种解决方案(部分形式映射),以防类在任何方式中不相关,可以使用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
重复一遍,这有点危险,当你离开安全的静态类型世界时,会跳入动态强大的混乱中,所以如果你使用它,请谨慎使用它。
【讨论】:
这些类有多少属性?它们是“手写”类吗?
也许您不需要两个类,可以删除其中一个并在任何地方使用另一个?
也许其中一个类可以派生自另一个?然后你只需要在基类中编写通用属性和方法。
如果您需要两个不同的类,并且都不从另一个派生(这是允许“普通”强制转换(引用转换强制转换)的情况),您有多种选择:
public static explicit operator ClassOne(ClassTwo ct) 来完成“翻译”。有了它,就可以使用标准的转换语法(例如(ClassOne)variable),或者【讨论】: