C# 当两个对象都是不同类型但继承自同一父类时,如何将一个对象转换为另一个对象
我有两个对象,对象A和对象B。A有属性颜色和大小,B有属性颜色、大小和深度 A和B都继承自抽象类C 如何在运行时将B转换为AC# 当两个对象都是不同类型但继承自同一父类时,如何将一个对象转换为另一个对象,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 =
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;”。