当两个对象都是不同的类型但是从同一个父类继承时,如何将一个对象转换为另一个对象

时间:2013-07-03 06:12:39

标签: c#

我有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 个答案:

答案 0 :(得分:9)

您可以向班级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};
    }
}

然后,您可以使用演员阵容将B转换为A

A a = (A)b;

答案 1 :(得分:5)

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

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

您还可以将List<A>转换为List<B>,这很方便。

AutoMapper Link on github

修改

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

您不需要明确指定除<; p>之外的任何内容

AutoMapper.CreateMap<A,B>();

然后你可以映射;

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

修改2

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

答案 2 :(得分:1)

在这种情况下,如果没有额外的工作,您无法直接将B转换为A.

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

如果您不想这样做,您的其他选项是编写转换方法或添加implicit转换,以便您可以将B转换为A或使用类似Automapper的库

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

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

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

A myA = (A)myB;

我仍然会怀疑这是不是一个好主意

答案 3 :(得分:0)

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

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