从派生对象中提取基对象

本文关键字:对象 提取 派生 | 更新日期: 2023-09-27 18:36:58

我有一个类A和一个派生自A的类B。我有一个B的实例,即b,我想从中提取A部分。像这样:

var b = new B(); 
A a = (SomeCast)b;

捕获是a.GetType()应返回A类型而不是B

是否可以不创建A实例并从b手动复制所有字段和属性?

更新问题的根源源于实体框架,该框架不允许添加派生类型来代替基类型。我有一个 biiig 派生类型(不允许添加注释),并且只想将基本部分添加到数据库中。

我只是好奇有一个简单的答案。

从派生对象中提取基对象

如果B继承自A,它们的所有B实例也将是A的实例,A的所有字段和属性都可以在B的实例中使用。

在你的代码中,你不需要强制转换,只需进行赋值:

var b = new B();
A a = b;

但是不需要这个,你可以将b作为A的实例,而无需创建变量a

免责声明:前面的代码很丑陋

好吧,我将冒着收到很多负面反馈的风险,但让我们看看这是否是OP想要的。

正如每个人都已经告诉您的那样,没有办法将派生"剥离"到基类中。所以我在这里提出的只是一个使用反射的黑客。

public class A
{
    public A()
    {
    }
    public A(B inhClass)
    {
        foreach (var prop in typeof(A).GetProperties())
        {
            PropertyInfo myPropInfo = typeof(B).GetProperty(prop.Name);
            prop.SetValue(this, myPropInfo.GetValue(inhClass, null), null);
        }
    }
    public string a { get; set; }
}
public class B:A
{
    public string b { get; set; }
    public A baseclass
    {
        get
        {
            return new A(this);
        }
    }

}

如您所见,在类 B 中,我添加了一个新的属性,使用类 A 中的新构造函数返回 A 的新实例。这个新的构造函数循环基类中的所有属性,并从派生类中获取值。

就是这样,我对公开私刑持开放态度:)