【问题标题】:Given System.Type T, Deserialize List<T>给定 System.Type T,反序列化 List<T>
【发布时间】:2010-11-08 20:46:58
【问题描述】:

我有许多要序列化和反序列化的类。我正在尝试创建一个函数,给定类型(“用户”、“管理员”、“文章”等)将使用这些项目的列表反序列化文件。例如:

/* 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&lt;Article&gt;) 而不是“漂亮”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));

谢谢!

【问题讨论】:

    标签: c# asp.net xml-serialization xml-deserialization generic-list


    【解决方案1】:

    你快到了……你需要声明一个泛型方法:

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

    【讨论】:

    • 谢谢,托马斯!如果我想缓存这些项目,我会使用... Cache["asset" + typeof(T).ToString()] = items; ...对吗?
    • 谢谢,托马斯。这真的很有帮助。虽然看起来改变函数声明/原型需要重写大量的依赖代码。在声明 GetAllItems(System.Type T) 的函数中是否有更简单的方法来实例化这些元素的 LIST 的序列化程序 - 像这样:“new XmlSerializer(typeof(List)) ;"?
    • 有可能,但很丑……你必须使用new XmlSerializer(typeof(List&lt;&gt;).MakeGenericType(T))
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2012-08-23
    • 2012-09-09
    • 2015-10-25
    • 2017-08-30
    相关资源
    最近更新 更多