向上铸造 – c#

public class a{ public string x1 {get;set;} public string x2 {get;set;} public string x3 {get;set;} } public class b:a{ } 

显然var foo = (b)new a(); 将在运行时抛出一个转换错误。

我可以考虑分配已经实例化和填充a所有属性的唯一方法是手动将每个属性复制到b的新实例中。

它是否正确?

这种类型的演员是错误的,因为你不能把父母送给他们的孩子。
a的类型不知道b型的元信息。 因此,您需要提供显式强制转换运算符来执行此类操作, 但在这种情况下,您必须删除inheritance
其他选项是定义一些界面,例如在其他问题中。

更多信息:
http://msdn.microsoft.com/en-us/library/ms173105.aspx
http://msdn.microsoft.com/en-us/library/85w54y0a.aspx

不可能。 即使你认为你拥有它,编译器也会抱怨。

这通常表示设计或逻辑错误。

这也是一直困扰着我的事情。 我通过创建自己的Up-Casting实用程序来制定解决方案。

你可以在这里阅读我的文章,了解如何做到这一点 – 实际上非常简单。

http://sympletech.com/c-up-casting-utility/

你实际上寻找的实际上是一个DOWNCAST,而不是一个向上的。 要做到这一点,让我们假设你有一个类似ObjA的对象。 现在创建一个ObjNewA对象,执行以下操作:

 b new_ObjNewA = ObjA as b; 

上面的代码应该100%工作

可以这样想: ClassName NewObject = OldObject as ClassName;

其中类名是inheritance类或子类。 这是一个截图,以确保它的工作原理:

在此处输入图像描述

你无法进​​行演员表演。

你可以,我想你应该使用一个界面。

 public interface ia { string x1 { get; set; } string x2 { get; set; } string x3 { get; set; } } public class a : ia { public string x1 { get; set; } public string x2 { get; set; } public string x3 { get; set; } } public class b : a, ia { } 

然后你可以

 ia foo = new a(); 

实际上,你创建一个新的b实例并将一个字段值复制到它的想法似乎是一个有趣的方法。 使用reflection实现这一点应该很好地符合法案。

类似于:遍历所有字段,获取存储在a中的值,并将它们存储在b中的相同字段中。

尽管如此,这并不是“向下倾斜” – 因为它意味着创建了一个完全不同的对象 – 而不是重新解释现有对象的含义。

正如大家所说,这是不可能的。 隐式转换是一种解决方案,但我更喜欢在b上创建一个构造函数,它接受类型为a的实例…

这样你就可以:在内部保持对a的引用并委托给它调用binheritance自a,或者只是简单地复制a类型的值。