Данный System.Type T, список десериализации <T> - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть несколько классов, которые я хочу сериализовать и десериализовать.Я пытаюсь создать функцию, которая с учетом типа («Пользователь», «Администратор», «Статья» и т. Д.) Будет десериализовать файл со списком этих элементов.Например:

/* 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>) вместо "pretty" 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));

Спасибо!

1 Ответ

3 голосов
/ 08 ноября 2010

Вы почти у цели ... вам нужно объявить универсальный метод:

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