向上铸造 – 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实用程序来制定解决方案。
你可以在这里阅读我的文章,了解如何做到这一点 – 实际上非常简单。
你实际上寻找的实际上是一个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类型的值。