2013-03-23 63 views
0

我有一個從我的數據庫加載數據的類。在這個類中,我有一個函數實際加載數據並以DataTable的形式將其返回給調用函數。c#填充調用函數中指定的對象的列表

然後我遍歷DataTable並基於每一行創建各種類的對象。

我想要做的是改變流程,所以我可以調用加載數據的函數,以確定應該創建的對象的類型。這裏有兩個僞來電顯示呼叫的類型我想提出:

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

眼下班老師和學生不擴展了一個公共類。但是,如果有幫助,我可以做出這樣的改變。

UPDATE:

感謝大家至今誰給了答案。看來沒有任何一種解決方案會改善我的代碼或超出我的編程技能。

我沒有找到這個帖子:Create an instance of a class from a string

在那裏有人提到了以下技術從一個字符串創建類:System.Reflection.Assembly.GetExecutingAssembly()的CreateInstance(字符串的className)

然而,他們還說,最終的對象必須投入到實際的課程中。所以它讓我想知道如果我把結果類(在投射之前)放到一個List中,是否會自動投射該對象?

回答

0

您可以使用枚舉來使您的類受到歡迎,並將此類型的變量傳遞給您的函數。但是我認爲用一個函數來加載所有的列表並不是一個好主意,因爲如果你有很多類要加載,你最終會得到亂碼。

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

當然這只是一種方法,但我認爲它會使事情比您描述的要乾淨一些。您也可以使用泛型,但您需要爲學生和教師提供一個通用界面。

0

這聽起來像你想寫一個簡單的ORM (Object Relational Mapping)組件。而不是自己實施它,我會調查Microsoft's Entity FrameworkNHibernate。這些將從數據庫中加載和保存對象,並根據需要對序列化進行精細控制。

但是,關注您所遇到的問題,我會建議將數據加載到每個對象的單獨類中,實際上是repository pattern。這樣,當班級被添加或刪除到您的產品中時,您不會將更改集中在單個班級上。存儲庫類可以共享一個公共基類以避免代碼重複。

2

不,我會推薦它,但要嚴格回答這個問題,你可以做到以下幾點:

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建議的方法是穩固的。