Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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/4/oop/2.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/opengl/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#_Oop_Polymorphism - Fatal编程技术网

C# 在多态性中获取数据库数据

C# 在多态性中获取数据库数据,c#,oop,polymorphism,C#,Oop,Polymorphism,我有基类和多个派生类,如下所示: public class Person { public int Id { get; set; } public string Name { get; set; } } public class Parent : Person { public int Age { get; set; } } public class Child : Person { public int Grade { get; set; }

我有基类和多个派生类,如下所示:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }    
}

public class Parent : Person
{
    public int Age { get; set; }
}

public class Child : Person
{
    public int Grade { get; set; }
    public Parent Father { get; set; }
    public Parent Mother { get; set; }
}
Name = reader["Name"].ToString();
Age = int.Parse(reader["Age"].ToString());
每个类在数据库中都有一个表,带有一个字段

当我想从数据库获取数据并初始化Person实例时,我需要为每个属性设置值,如下所示:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }    
}

public class Parent : Person
{
    public int Age { get; set; }
}

public class Child : Person
{
    public int Grade { get; set; }
    public Parent Father { get; set; }
    public Parent Mother { get; set; }
}
Name = reader["Name"].ToString();
Age = int.Parse(reader["Age"].ToString());
现在,我不想在每个派生类上都这样做,但通常在基类中这样做。
最好的方法是什么?谢谢。

首先,您可以在这里找到的最佳答案是:采用类似或/M的实体框架、NHibernate或Dapper(或任何其他)并将精力集中在业务上,而不是在基础架构细节上浪费时间

另一方面,如果您想要一种使用自己的代码解决问题的方法,我会说您需要创建数据映射器的概念。它将是一个类,它应该定义关系和面向对象对应项之间的映射

这样,当您尝试获取派生类时,可以实例化基类和派生类数据映射器,并调用它们以获取整个列数据:

DerivedClass derivedClassInstance = new DerivedClass();

DerivedClassDataMapper derivedMapper = new DerivedClassDataMapper(derivedClassInstance, dataReader);
derivedMapper.Fetch();

// Now your derivedClassInstance reference will contain an object which
// has both data from base and derived class...
最后,我想说,两个数据映射器都应该从
DataMapper
基类继承,其中
Fetch
方法应该标记为
virtual
(或
abstract
),以便派生数据映射器添加更多映射代码(这样,基本映射器将属性映射到基类中定义的列,派生类将重写
Fetch
以添加更多映射,等等…)

无论如何,你不应该重新发明轮子,因为有实体对象关系映射器