2

我有 2 个对象,对象 A 和对象 B。A 具有颜色和大小属性,B 具有颜色、大小和深度属性。

A 和 B 都继承自抽象类 C。

如何在运行时将 B 转换为 A?

 abstract class C {

 }

 Class A: C {
     int color;
     int size;
 }

 Class B: C {
     int color;
     int size;
     int depth;
 }

 main() {
     //creating object A
     A objA = new A();
     A.color = 46;
     A.size = 90;

     //creating object B
     B objB = new B();
     B.color = 23;
     B.size = 10;
     B.depth = 78;

     //How to do casting 
     A = B;
 }
4

4 回答 4

9

您可以将显式转换运算符添加到 in 类B

Class B: C {
    int color;
    int size;
    int depth;
    public static explicit operator A(B b)
    {
        return new A() {color = b.color, size = b.size};
    }
}

然后,您可以使用强制转换将 a 转换BA

A a = (A)b;
于 2013-07-03T06:30:00.150 回答
6

当我遇到这样的问题时,我使用了 AutoMapper。

这是一个免费库,允许您将一个对象映射到另一个对象,甚至允许您将一个字段映射到另一个具有不同名称和类型的字段。

您还可以将 a 转换List<A>List<B>方便的。

github上的AutoMapper链接

编辑

阅读您的最后一条评论后,我认为 AutoMapper 可能是您的解决方案。

您不需要明确指定除以下内容之外的任何内容;

AutoMapper.CreateMap<A,B>();

然后你可以映射;

B b = Mapper.Map<A,B>(sourceA);

编辑 2

或者自己使用反射并创建一个以 A 作为参数并将适当的字段/属性从 A 复制到 B 的扩展。

于 2013-07-03T06:16:42.207 回答
1

在这种情况下,如果没有一些额外的工作,您不能直接将 B 转换为 A。

如果将公共字段移动到基类中,则可以将 B 传递给需要基类实例的方法,并且它只会访问公共字段。

如果您不想这样做,您的其他选择是编写转换方法或添加隐式转换,以便您可以将 B 转换为 A 或按照建议使用像 Automapper 这样的库

隐式转换可能看起来像这样

Public static implicit operator A (B theB)
{
    return new A (theB.colour, theB.size);
}

然后允许您将 B 实例转换为 A 实例。

A myA = (A)myB;

我仍然会质疑这是否是个好主意

于 2013-07-03T06:21:03.690 回答
0

它不会像这样工作。您正在制作两个具有几乎相同属性的不同变量?!为什么这样?

您可以将公共字段转换为基类!这是这里最好的方式。

于 2013-07-03T06:19:16.937 回答