Up casting - c#

本文关键字:casting Up | 更新日期: 2023-09-27 17:59:01

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的新实例中。

这是正确的吗?

Up casting - c#

这种类型的强制转换是错误的,因为不能将父母强制转换为他们的孩子
类型a不知道类型b的元信息。因此,您需要提供显式强制转换运算符来执行这些操作,,但在这种情况下,您必须删除继承
另一种选择是定义一些接口,例如在其他问题中。

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

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

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

这件事也一直困扰着我。我通过创建自己的UpCasting实用程序找到了解决方案。

你可以在这里阅读我关于如何做到这一点的文章——实际上很简单。

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

您不能进行该转换。

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

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的新实例并将a的字段值复制到其中似乎是一种有趣的方法。使用反射来实现这一点应该非常符合要求。

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

尽管如此,这并不是"向下转换"——因为这意味着创建了一个完全不同的对象——而不是重新解释现有对象的含义。

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

通过这种方式,您可以:在内部保留对a的引用,并委托它调用b从a继承,或者只是简单地将值从类型a中复制出来。