我有基类和多个派生类,如:
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; }
}
每个类在数据库中都有一个表,有一个适当的字段。
当我想从DB获取数据并初始化Person的实例时,我需要为每个属性设置值,如:
Name = reader["Name"].ToString();
Age = int.Parse(reader["Age"].ToString());
现在,我不想在每个派生类上执行此操作,但通常在基类中执行此操作。 最好的方法是什么?谢谢。
答案 0 :(得分:1)
首先,您可以在这里找到的最佳答案是:采用OR / 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
以添加更多映射等等...)。
无论如何,你不应该重新发明轮子,因为那里有坚实的物体关系映射器。