0

我有一些我想序列化和反序列化的類。我試圖創建一個函數,給定一個類型(「用戶」,「管理員」,「文章」等)將反序列化文件與這些項目的列表。例如:給定System.Type T,反序列化列表<T>

/* I want to be able to do this */ 
List<Article> allArticles = GetAllItems(typeof(Article)); 

我無法弄清楚如何實現上述目標,但我設法得到這個工作:

/* BAD: clumsy method - have to pass a (typeof(List<Article>)) 
    instead of typeof(Article) */ 
List<Article> allArticles = (List<Article>)GetAllItems(typeof(List<Article>)); 

/* Then later in the code... */ 
public static IList GetAllItems(System.Type T) 
{ 

    XmlSerializer deSerializer = new XmlSerializer(T); 

    TextReader tr = new StreamReader(GetPathBasedOnType(T)); 
    IList items = (IList) deSerializer.Deserialize(tr); 
    tr.Close(); 

    return items; 
} 

的問題是,我必須通過「醜陋」 typeof(List<Article>),而不是「漂亮「typeof(Article)

當我試試這個:

List<User> people = (List<User>)MasterContactLists.GetAllItems(typeof(User)); 

/* Followed by later in the code...*/ 
public static IList GetAllItems(System.Type T) 
{ 
    XmlSerializer deSerializer = new XmlSerializer(typeof(List<T>)); 

    TextReader tr = new StreamReader(GetPathBasedOnType(T)); 
    IList items = (IList)deSerializer.Deserialize(tr); 
    tr.Close(); 

    return items; 
} 

...我得到一個錯誤

/*Error 3 
The type or namespace name 'T' could not be found 
(are you missing a using directive or an assembly reference?) 
on this line: ... = new XmlSerializer(typeof(List<T>)); */ 

問:我怎樣才能解決我GetAllItems()能夠調用函數像這樣並將它返回列表:

List<Article> allArticles = GetAllItems(typeof(Article)); 

謝謝!

回答

3

你幾乎沒有......你需要聲明一個泛型方法:

public static IList<T> GetAllItems<T>() 
{ 
    XmlSerializer deSerializer = new XmlSerializer(typeof(List<T>)); 

    using(TextReader tr = new StreamReader(GetPathBasedOnType(typeof(T)))) 
    { 
     IList<T> items = (IList<T>)deSerializer.Deserialize(tr); 
    } 

    return items; 
} 
+0

謝謝,托馬斯!如果我想緩存項目,我會用... Cache [「asset」+ typeof(T).ToString()] = items; ...對不對? – 2010-11-08 20:57:48

+0

我想你可以做到這一點,但我不是很熟悉ASP.NET ...... – 2010-11-08 21:23:39

+0

謝謝,托馬斯。這真的很有幫助。儘管看起來像改變函數聲明/原型需要重寫大量的相關代碼。在聲明GetAllItems(System.Type T)的函數中是否有一個更簡單的方法來實例化這些元素的** LIST **的序列化程序 - 就像這樣:「new XmlSerializer(typeof(List ));」? – 2010-11-08 21:41:49