将子对象转换为父对象

Jul*_*les 19 c#

我需要能够将子对象的实例强制转换为父对象的实例.

public class Parent 
{
 public string name{get;set;} 
}

public class Child : Parent{}

var myClass = new Child()
(Parent)myClass
//this doesnt seem to work and the object still has childs type.
Run Code Online (Sandbox Code Playgroud)

是否有另一种方式来施展它?

谢谢

Mat*_*nde 11

你没有将演员阵容分配给任何东西.

var myClass = new Child();
Parent p = (Parent)myClass;
Run Code Online (Sandbox Code Playgroud)

编辑 - 我认为你误解了投射是如何运作的.Say Parent有一个被覆盖的virtual方法.即使你投来,它要运行的方法.无论如何,即使你施展它,它也是一个,而且永远都是一个.DoStuff()ChildmyClassParentChildDoStuffChildChildChild

如果您尝试将其传递给接受Parent对象的方法,则不必强制转换它.它已经是一个Parent,因为它是一个Child.

我想我们错过了一些东西.你还想尝试什么?什么不起作用?


Ran*_*pho 9

这应该工作.

但是我怀疑你编写代码的方式是不是在新变量中捕获了转换对象?试试这个:

var myClass = new Child()
var myClassAsParent = (Parent)myClass;
// myClassAsParent still has the type "Child", but can be accessed as if it were a Parent.
Run Code Online (Sandbox Code Playgroud)

编辑 根据你一直留下的一些评论,我相信你误解了大多数编程语言的一个基本方面.就是这样:对象的类型不能改变.实例化为Child对象的对象始终是Child对象.

转换不会更改对象的类型.转换会改变程序其余部分"看到"对象的方式.如果愿意,它会更改对象的界面.因此,如果你将一个Child对象转换为一个Parent类型,程序的其余部分会认为它正在处理一个Parent类型,但它实际上处理的Child类型是,使用一个非常糟糕的类比,穿着它的父母的衣服.

简而言之,Casting不会按照您的想法行事.


Ser*_*rvy 7

问题是xml serialiser将具有子类型的对象序列化为根元素.我真的不想将目标类型一直传递给序列化器.有没有更好的办法? - 朱尔斯

我没有多次使用序列化,但我的猜测是你需要改变你在子元素中"我如何序列化自己"的定义,将它自己写出来,好像它是父母一样.

如果你想要实际拥有"父"的实例,那么你需要创建一个新的Parent并将Child中的所有值复制到该Parent.(如果你有很多,我不会这样做,但如果你没有那么多,那么它应该不是问题.)最简单的方法是在Parent中创建一个复制构造函数.它将是一个构造函数,它将Parent作为参数并将参数复制到自身的值(在这种情况下为Name,我假设您可能已省略其他值).然后你可以创建一个新的Parent,传入Child作为参数(因为Child是一个Parent,不需要强制转换/转换),它会吐出一个实际的Parent实例.


Ren*_*nan 5

我在这里晚了大约五年,但是......

您可以使用AutoMapper来解决您的问题。

只需定义父类和子类之间的映射。最简单的地图就可以了。在定义映射的类中:

CreateMap<Child, Parent>();
Run Code Online (Sandbox Code Playgroud)

然后,在您的代码中的任何一点,您都可以执行以下操作:

Child child = new Child();
Parent parent = Mapper.Map<Parent>(child);
Run Code Online (Sandbox Code Playgroud)

并且您的parent对象将是Parent没有任何child对象属性的纯对象。

正如其他人所说,投射对象将保留其类型。那只会改变指针。但是 AutoMapper 创建目标类型的新实例并将值从参数复制到目标类型的实例,按名称匹配属性。