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

C# 当两个对象都是不同类型但继承自同一父类时,如何将一个对象转换为另一个对象,c#,C#,我有两个对象,对象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 =

我有两个对象,对象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;
 }

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

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

您还可以转换
列表

编辑

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

您无需明确指定除以下内容以外的任何内容:

AutoMapper.CreateMap<A,B>();
AutoMapper.CreateMap();
然后你可以绘制地图

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

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

它不会这样工作。 你在用几乎相同的属性制作两个不同的变量?! 为什么会这样


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

在这种情况下,如果不做一些额外的工作,就不能直接将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;

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

您可以向类中的
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;

在这种情况下,你不能将A转换为B。为什么不将公共字段移到基类中呢?那么当它被复制到
A
时,
B.depth
会发生什么呢?我希望程序在从B向A施放时忽略深度。猫和狗都继承自动物。为什么我不能把一只狗变成一只猫呢?你应该重新考虑你的阶级结构,所有的圆都是长轴和短轴相等的椭圆。举一个复杂的例子,下面是我如何定义一个正方形:
Shape->Polygon->四边形->平行四边形->矩形->square
,因为所有的正方形都是矩形(所有的矩形都是平行四边形等等)。每一层可以保存一段公共信息,例如
形状
将保存颜色,
多边形
将保存边数,等等。。。像square这样的东西只是父类的包装器
类square:Rectangle{publicsquare(intx):base(x,x){}
有效答案。。然而,我认为一个更合适的答案是“重新思考你的设计”:(有时,你被交给的对象超出了你的设计影响范围,我怀疑这就是为什么创建AutoMapper的原因。:)或者您正在使用不一定从原始源数据类型继承的数据传输对象,或者甚至从不符合任何数据库对象的web服务获取对象。使用隐式运算符,您无需指定强制转换。您可以只写“A myA=myB;”。