Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从派生对象中提取基础对象_C#_Entity Framework - Fatal编程技术网

C# 从派生对象中提取基础对象

C# 从派生对象中提取基础对象,c#,entity-framework,C#,Entity Framework,我有一个类a和一个类B,它派生自a。我有一个B的实例,即B,我只想从中提取A部分。比如: var b = new B(); A a = (SomeCast)b; catch是a。GetType()应该返回aType而不是B 是否可以不创建A的实例并从b手动复制所有字段和属性 更新 问题的根源来自实体框架,它不允许添加派生类型来代替基类型。我有一个biiig派生类型(不允许向其添加注释),只想将基本部分添加到数据库中 我只是好奇有没有一个简单的答案。如果B继承自a,那么B的所有实例都将是a的实

我有一个类
a
和一个类
B
,它派生自
a
。我有一个
B
的实例,即
B
,我只想从中提取
A
部分。比如:

var b = new B(); 
A a = (SomeCast)b;
catch是
a。GetType()
应该返回
a
Type而不是
B

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

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


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

如果
B
继承自
a
,那么
B
的所有实例都将是
a
的实例,
a
的所有字段和属性都可以在
B
的实例中使用

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

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

但是不需要这样做,您可以将
b
作为
A
的实例使用,而无需创建变量
A

,如果
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的新实例。这个新构造函数循环基类中的所有属性,并从派生类获取值

就这样,我被公开私刑了:)

免责声明:前面的代码很难看

好吧,我会冒着风险接受很多负面反馈,但让我们看看这是否是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的新实例。这个新构造函数循环基类中的所有属性,并从派生类获取值


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

基本多态性得出结论,就所有意图和目的而言,
b
A
的一个实例<代码>A=b在逻辑上是
A
的一个实例。为什么还需要
GetType()
来演示这一点?退一步说,这里要解决的问题是什么?问题的根源来自实体框架,它不允许添加派生类型来代替基类型。我有一个biiig派生类型(不允许添加注释),只想将基本部分添加到数据库中。您应该明确地将该上下文添加到问题中,并提供一个尝试在EF中使用该变量的示例及其导致的错误。这很可能是一个EF问题,而不是多态性问题,你需要确保这个问题吸引了正确的专家注意。谢谢David,这个问题是从EF开始的,但现在我只是好奇,是否有一个简单的答案,或者我应该做长期的工作。为了清晰起见,我添加了
Entity Framework
标记,因为这将有助于缩小提出此问题的背景。尽管我建议OP也为这个问题添加一些与EF相关的上下文。基本多态性得出结论,就所有意图和目的而言,
b
A
的一个实例<代码>A=b在逻辑上是
A
的一个实例。为什么还需要
GetType()
来演示这一点?退一步说,这里要解决的问题是什么?问题的根源来自实体框架,它不允许添加派生类型来代替基类型。我有一个biiig派生类型(不允许添加注释),只想将基本部分添加到数据库中。您应该明确地将该上下文添加到问题中,并提供一个尝试在EF中使用该变量的示例及其导致的错误。这很可能是一个EF问题,而不是多态性问题,你需要确保这个问题吸引了正确的专家注意。谢谢David,这个问题是从EF开始的,但现在我只是好奇,是否有一个简单的答案,或者我应该做长期的工作。为了清晰起见,我添加了
Entity Framework
标记,因为这将有助于缩小提出此问题的背景。虽然我建议OP也给这个问题添加一些与EF相关的上下文。谢谢Arturo,但是a.GetType()返回B,而不是a。如果a.GetType()返回a,那么你肯定会丢失B中的所有额外内容?我想在这里进行对象切片。整个“不允许添加派生类型来代替基类型”真的很奇怪。我想如果对象是按值复制的,那么就会出现切片问题。谢谢Arturo,但是a.GetType()返回B,而不是a。如果a.GetType()返回a,那么肯定会丢失B中的所有额外内容?我想在这里进行对象切片。整个“不允许添加派生类型来代替基类型”真的很奇怪。我想如果对象是按值复制的,那么就会出现切片问题。