2009-09-10 6 views
10

J'ai essayé de le faire pour un bon quelques heures maintenant et cela est aussi loin que j'aiComment puis-je effectuer une liste <object> .Cast <T> utilisant la réflexion lorsque T est inconnu

var castItems = typeof(Enumerable).GetMethod("Cast") 
        .MakeGenericMethod(new Type[] { targetType }) 
        .Invoke(null, new object[] { items }); 

Cette retourne me

System.Linq.Enumerable + d__aa`1 [MyObjectType]

alors que je besoin (pour mon ViewData) liste générique c.-à-

System.Collections.Generic.List`1 [MyObjectType]

Tous les pointeurs seraient très

Répondre

17

Vous avez juste besoin d'appeler ToList() là-dessus plus tard:

static readonly MethodInfo CastMethod = typeof(Enumerable).GetMethod("Cast"); 
static readonly MethodInfo ToListMethod = typeof(Enumerable).GetMethod("ToList"); 

... 

var castItems = CastMethod.MakeGenericMethod(new Type[] { targetType }) 
          .Invoke(null, new object[] { items }); 
var list = ToListMethod.MakeGenericMethod(new Type[] { targetType }) 
          .Invoke(null, new object[] { castItems }); 

Une autre option serait d'écrire une seule méthode générique dans votre propre classe pour ce faire, et appelez que avec réflexion:

private static List<T> CastAndList(IEnumerable items) 
{ 
    return items.Cast<T>().ToList(); 
} 

private static readonly MethodInfo CastAndListMethod = 
    typeof(YourType).GetMethod("CastAndList", 
           BindingFlags.Static | BindingFlags.NonPublic); 

public static object CastAndList(object items, Type targetType) 
{ 
    return CastAndListMethod.MakeGenericMethod(new[] { targetType }) 
          .Invoke(null, new[] { items }); 
} 
+0

Merci complètement oublié que (aveuglement de code avait mis en) merci. [btw pour être complet il ya une faute de frappe dans votre méthode pour toute personne qui voudrait copier n'importe quelle pâte devrait dire var list = ToListMethod.MakeGen .....] –

+0

J'ai corrigé la faute de frappe. –

+0

Brillant. Difficile à trouver, mais totalement résolu mon problème. Merci a tous. –

Questions connexes