用函数调用中指定的对象填充列表
本文关键字:对象 填充 列表 函数调用 | 更新日期: 2023-09-27 18:05:30
我有一个从数据库加载数据的类。在这个类中,我有一个函数,它实际加载数据并以DataTable的形式将其返回给调用函数。
然后遍历DataTable并基于每一行创建各种类的对象。
我想做的是改变流,这样我就可以调用加载数据的函数,它可以确定应该创建的对象的类型。下面是我想要拨打的电话类型:
List<Teacher> =this.loadData(String sql, Hashtable data, {teachers class});
List<Student> = this.loadData(String sql, Hashtable data, {students class});
现在的类教师和学生不扩展一个共同的类。但是,如果有帮助的话,我可以做这样的修改。
李更新:感谢到目前为止给出答案的每个人。似乎没有一个解决方案能够真正改善我所拥有的代码,或者超出了我的编程技能。
我确实发现了这篇文章:从字符串创建一个类的实例
中有人提到了以下从字符串创建类的技术:System.Reflection.Assembly.GetExecutingAssembly()。调用CreateInstance (string类名)
然而,它们也说结果对象必须被强制转换成实际的类。所以这让我想知道,如果我把结果类(在强制转换之前)放入List中,这样做会自动强制转换对象吗?
如果没有的话,请尝试将检索数据库数据的代码包装到一个类中。然后添加两个方法来返回对象的特定类型。
public class MyDataProvider
{
bool isDataLoaded = false;
public void LoadData(String sql, Hashtable data)
{
// Load data.
isDataLoaded = true; // Or whatever mechanism you want to use to ensure data is loaded.
}
public IEnumerable<Student> GetStudents()
{
// Process student data if isDataLoaded.
}
public IEnumerable<Teacher> GetTeachers()
{
// Process teacher data if isDataLoaded.
}
}
然后使用你所描述的列表。
MyDataProvider dp = new MyDataProvider("abc", data);
List<Student> students = new List<Student>();
students.AddRange(dp.GetStudents());
List<Teacher> teachers = new List<Teacher>();
teachers.AddRange(dp.GetTeachers());
当然这只是一种方法,但我认为它会使事情比你描述的更清晰。您也可以使用泛型,但是您需要为Student和Teacher提供一个公共接口。
我不建议这么做,但要严格回答这个问题,您可以这样做:
public List<T> loadData<T>(String sql, Hashtable data)
{
var type = typeof(T);
if (type == typeof(Teacher))
{
// replace with code that builds Teacher list...
return List<Teacher>() as List<T>;
}
else if (type == typeof(Student))
{
// replace with code that builds Student list...
return List<Student>() as List<T>;
}
else
{
throw new NotImplementedException();
}
}
调用它,执行以下操作:
var teachers = loadData<Teacher>(sqlString, dataTable);
var students = loadData<Student>(sqlString, dataTable);
当然,随着类型数量的增加,这种方法存在维护问题。可能还有其他方法,但@Inisheer建议的方法是可靠的。
可以使用enum枚举类,并将此类型的变量传递给函数。但我认为用一个函数来加载所有列表并不是一个好主意,因为如果你有很多类要加载,你最终会得到混乱的代码。
听起来您想要编写一个简单的ORM(对象关系映射)组件。与其自己实现它,我更愿意研究微软的实体框架或NHibernate。它们将从数据库中加载和保存对象,并根据需要对序列化进行尽可能细粒度的控制。
但是,针对您所遇到的问题,我建议将数据加载拆分为每个对象的单独类,这实际上是存储库模式。这样,当向产品添加或删除类时,您就不会将更改的重点放在单个类上。存储库类可以共享一个公共基类,以避免代码重复。