1

我有一个从我的数据库加载数据的类。在这个类中,我有一个函数,它实际加载数据并将其以 DataTable 的形式返回给调用函数。

然后我遍历 DataTable 并根据每一行创建各种类的对象。

我想做的是改变流程,这样我就可以调用加载数据的函数,它可以确定应该创建的对象的类型。这里有 2 个伪调用来显示我想要进行的调用类型:

List<Teacher> =this.loadData(String sql, Hashtable data, {teachers class});
List<Student> = this.loadData(String sql, Hashtable data, {students class});

现在,教师和学生类不扩展公共类。但是,如果它有帮助,我可以做出这样的改变。

更新:

感谢到目前为止所有给出答案的人。似乎没有一个解决方案能真正改进我拥有或超出我的编程技能的代码。

我确实找到了这篇文章:Create an instance of a class from a string

在那里有人提到了以下从字符串创建类的技术: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)

但是,他们还说必须将生成的对象转换为实际的类。所以这让我想知道我是否将生成的类(在转换之前)放入一个列表中,这样做会自动转换对象吗?

4

4 回答 4

2

如果没有,请尝试将检索数据库数据的代码包装到一个类中。然后添加两个方法来返回特定类型的对象。

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());

当然这只是一种方法,但我认为它会让事情比你描述的更干净。您也可以使用泛型,但您需要为学生和教师提供一个通用接口。

于 2013-03-23T03:54:30.423 回答
2

Not that I'd recommend it, but to strictly answer the question, you could do the following:

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();
    }
}

To call it, do the following:

var teachers = loadData<Teacher>(sqlString, dataTable);
var students = loadData<Student>(sqlString, dataTable);

Of course, this approach has maintenance issues as the number of types grow. There may be other approaches, but the one suggested by @Inisheer is a solid one.

于 2013-03-23T04:05:43.457 回答
0

您可以使用枚举来枚举您的类并将这种类型的变量传递给您的函数。但是我认为使用一个函数来加载所有列表并不是一个好主意,因为如果要加载许多类,最终会得到混乱的代码。

于 2013-03-23T03:47:27.533 回答
0

听起来您想编写一个简单的ORM(对象关系映射)组件。我不会自己实现它,而是研究Microsoft 的 Entity FrameworkNHibernate。这些将从数据库加载和保存对象,并根据需要对序列化进行尽可能多的细粒度控制。

但是,专注于您遇到的问题,我建议将数据加载拆分到每个对象的单独类中,有效地存储库模式。这样,当您的产品添加或删除类时,您不会将更改集中在单个类上。存储库类可以共享一个公共基类以避免代码重复。

于 2013-03-23T03:57:50.160 回答