2010-11-17 6 views
1

en essayant de faire ci-dessous, mais ne savent pas assez sur la réflexion évidemment. Exemple de ce que j'essaie de faire, je veux "résoudre" une liste de JazzDancer dans une liste de Dancer (dont tous les types de danseurs héritent). Vous voulez vous assurer que si DanceStyle est ici Jazz, seul le type JazzDancer sera dans la liste des danseurs. J'espère que cela a du sens.Possibilité de lancer une liste générique de type vers une liste générique de son super type?

Le problème est qu'il semble que vous ne pouvez pas lancer la liste en liste.

Est-ce encore possible?

List<Dancer> dancers = TypeNameResolver<Dancer>.ResolveList(DanceStyle, typeof(Dancer)); 


public static List<T> ResolveList(IDanceStyle style, Type toType) 
     { 
      Type list = typeof (List<>); 
      Type[] pars = { TypeNameResolver<T>.Resolve(style,toType).GetType()}; 
      List<T> result = (List<T>)Activator.CreateInstance(list.MakeGenericType(pars)); 
      return result; 
     } 

public static T Resolve(IDanceStyle style, Type toType) 
{ 
    Assembly a = Assembly.GetExecutingAssembly(); 
    var typeName = style.GetType().Name + toType.Name; 
    var toTypeNameSpace = toType.Namespace; 
    return (T)a.CreateInstance(toTypeNameSpace + "." + typeName); 
} 

Répondre

3

Vous n'avez pas besoin de réflexion pour cela. LINQ, d'autre part, peut aider ici:

List<JazzDancer> myListOfJazzDancers = ...; 
List<Dancer> myListOfDancers = myListOfJazzDancers.Cast<Dancer>().ToList() 
+0

merci, cela fonctionne. alors j'ai réalisé que je ne peux pas vraiment jeter la liste des JazzDancers dans la liste des danseurs et les avoir toujours comme JazzDancers, quand il est possible de faire cela en utilisant la méthode .Add et en y ajoutant des occurrences de JazzDancers. – andryuha

+0

@andryuha: Eh bien, vous pouvez les lancer sur JazzDancers après les avoir récupérés, si vous êtes sûr que la liste ne contient que JazzDancers. D'un autre côté, si vous êtes sûr qu'il ne contient que des JazzDancers, vous pourriez tout aussi bien utiliser un 'List ' en premier lieu ... – Heinzi

1

Vous pouvez le faire avec une requête Linq:

dancers = jazzDancers.Cast<Dancer>(); 

Si vous devez faire une sorte de contrôle sur chaque jazzDancer, vous ajoutez simplement un Where tel que:

dancers = jazzDancers.Where(jd => jd.SomeFiels == Something).Cast<Dancer>(); 
Questions connexes