0

J'ai un certain nombre de classes que je veux sérialiser et désérialiser. J'essaye de créer une fonction qui, donnée un type ("Utilisateur", "Administrateur", "Article", etc.) désérialise le fichier avec la liste de ces éléments. Par exemple:Étant donné System.Type T, désérialiser la liste <T>

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

Je ne peux pas comprendre comment atteindre ce qui précède, mais je réussi à obtenir ce travail:

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

Le problème est que je dois passer « laid » typeof(List<Article>) au lieu de " jolie "typeof(Article).

Quand j'essaie ceci:

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

... Je reçois une erreur

/*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>)); */ 

Question: comment puis-je réparer mon GetAllItems() pour pouvoir appeler la fonction comme celui-ci et l'ont retour une liste:

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

Merci!

Répondre

3

Vous y êtes presque ... vous avez besoin de déclarer une méthode générique:

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

Merci, Thomas! Et si je veux mettre en cache les éléments, j'utiliserais ... Cache ["asset" + typeof (T) .ToString()] = items; ... pas vrai? –

+0

Je suppose que vous pourriez le faire, mais je ne suis pas très familier avec ASP.NET ... –

+0

Merci, Thomas. Ceci est vraiment utile. Bien que cela ressemble à changer la déclaration de fonction/prototype nécessite de réécrire une tonne de code dépendant. Existe-t-il un moyen plus simple dans la fonction avec déclaration GetAllItems (System.Type T) d'instancier un sérialiseur de la ** LIST ** de ces éléments - comme ceci: "new XmlSerializer (typeof (List ));"? –

Questions connexes