在List< T>中使用参数System.Type T

假设我有一个功能:
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; 
} 
为了检索文章列表,我想打电话给
GetAllItems(typeof(Article))
而不是
GetAllItems(typeof(List<Article>))
但仍然返回一个列表。 问题:如何在不更改函数声明/原型的情况下,在调用此函数时避免不必要的
List<>
部分? 也就是说,我正在寻找这样的东西:
public static IList GetAllItems(System.Type T) 
{ 
    /* DOES NOT WORK:  Note new List<T> that I want to have */     
    XmlSerializer deSerializer = new XmlSerializer(List<T>); 

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

    return items; 
} 
    
已邀请:
如果我理解正确,你在流中有一个序列化列表,是吗?如果是这样,那么在第二个例子中改变它:
XmlSerializer deSerializer = new XmlSerializer(List<T>);
对于这样的事情:
if (!T.IsGenericType || T.GetGenericTypeDefinition() != typeof(List<>))
    T = typeof(List<>).MakeGenericType(new Type[] { T });

XmlSerializer deSerializer = new XmlSerializer(T);
这将检查传入的类型;如果它是
List<T>
那么它将被未经修改地使用。否则,将使用适当的
List<T>
类型。 换句话说,如果你传入
typeof(Foo)
那么T将变为
List<Foo>
。但如果你传入
typeof(List<Foo>)
那么T将留下
List<Foo>
。     
你正在调用GetAllItems(typeof(Article)),所以我假设你静态地知道这个类型。如果确实如此,那么:
public static IList<T> GetAllItems<T>() //Note T is now a type agrument
{
    //the using statement is better practice than manual Close()
    using (var tr = new StreamReader(GetPathBasedOnType(typeof(T)))) 
       return (List<T>)new XmlSerializer(typeof(List<T>)).Deserialize(tr);
}
你现在打电话给
GetAllItems<Article>()
。 另外,请考虑使用DataContractSerializer而不是XmlSerializer。     

要回复问题请先登录注册