用函数调用中指定的对象填充列表

本文关键字:对象 填充 列表 函数调用 | 更新日期: 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。它们将从数据库中加载和保存对象,并根据需要对序列化进行尽可能细粒度的控制。

但是,针对您所遇到的问题,我建议将数据加载拆分为每个对象的单独类,这实际上是存储库模式。这样,当向产品添加或删除类时,您就不会将更改的重点放在单个类上。存储库类可以共享一个公共基类,以避免代码重复。