C# - 如何复制/创建对象作为后代

标签 c# .net-3.5 inheritance

这个用例子更容易解释。给定这两个类:

public class MyClassA
{
    public String Property_A { get; set; }
    public String Property_B { get; set; }
    public String Property_C { get; set; }
    public String Property_D { get; set; }
    ...
    public String Property_Y { get; set; }
}

public class MyClassB: MyClassA
{
    public String Property_Z { get; set; }
}

假设我已经完全创建了 MyClassA 的实例(填充了 A - Y 的所有属性)。然后我需要创建一个 MyClassB 实例,它与我的 MyClassA 实例完全相同,但填充了 Property_Z(当然是自定义值)。我该怎么做?

这样做是行不通的(抛出和 Invalid Cast Exception):

MyClassB myInstanceB = (myClassB) myInstanceA;
myInstance.Property_Z = myCustomValue;

自从我使用 C++ 以来,我就不需要做这样的事情了,我很困惑。

有什么想法吗?


更新:我在如何创建实例方面找到了解决问题的方法。它在下面。我没有将其标记为答案,因为它不完全符合我的问题。

最佳答案

您创建的实例是 MyClassA。那是它的运行时类型,而不是 MyClassB。您不能在运行时将 MyClassA 实例转换为 MyClassB,因为 MyClassB 是比 MyClassA 更具体的类型。

您需要创建一个全新的 MyClassB 实例。清理它的一种方法是创建一个采用 MyClassA 的构造函数,例如

public class MyClassB : MyClassA
{
    public MyClassB(MyClassA a, string z)
    {
        this.PropertyA = a.PropertyA;
        this.PropertyB = a.PropertyB;
        // etc.
        this.PropertyZ = z;
    }

    public string PropertyZ { get; set; }
}

关于C# - 如何复制/创建对象作为后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390278/

相关文章:

c# - 用于生成各种分布的随机数的 C# 开源统计库?

c# - 如何判断 OpenXML 中段落的高度?

perl - Perl 继承的首选约定是什么

c# - 如何使用转发器显示 session 中的成员?

c# - asp.net webforms 中的动态路由

c# - 使用 SocketAsyncEventArgs 的服务器设计

C#通过附加可变数量的空格使字符串列表的元素唯一

c# - 使用.NET加密库在c#中使用.pem文件的私钥解密

java - 使用继承概念访问实例变量

java - 在Java设计中组合不再被使用得太多了吗?