2010-06-08 8 views
2

Je suis en train de créer une liste générique d'un type spécifique qui est récupéré d'ailleurs:utilisant C# type comme générique

Type listType; // Passed in to function, could be anything 
var list = _service.GetAll<listType>(); 

Cependant, je reçois une erreur de construction de:

The type or namespace name 'listType' could not be found (are you missing a using directive or an assembly reference?) 

Est Est-ce possible ou suis-je en train de mettre le pied sur le territoire dynamique C# 4? En arrière-plan: Je souhaite charger automatiquement toutes les listes avec les données du référentiel. Le code ci-dessous a passé un modèle de formulaire dont les propriétés sont itérées pour tout IEnum (où T hérite de DomainEntity). Je veux remplir la liste avec des objets du type de la liste faite à partir du référentiel.

public void LoadLists(object model) 
{ 
    foreach (var property in model.GetType() 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)) 
    { 
     if (IsEnumerableOfNssEntities(property.PropertyType)) 
     { 
      var listType = property.PropertyType.GetGenericArguments()[0]; 

      var list = _repository.Query<listType>().ToList(); 

      property.SetValue(model, list, null); 
     } 
    } 
} 

Répondre

3

Vous ne pouvez pas passer une variable comme un paramètre de type/méthode générique, mais vous pouvez faire des choses simples à l'aide de réflexion, par exemple, vous pouvez construire la liste de cette façon:

Type listType = typeof(int); 
var list = Activator.CreateInstance(typeof(List<>).MakeGenericType(listType)); 

Je ne sais pas si cela vous sera utile, puisque vous aurez besoin de lancer cette liste à quelque chose pour la rendre utile, et vous ne pouvez pas simplement la convertir en un type/interface générique sans spécifier de paramètres de type générique.

Vous pouvez toujours ajouter/énumérer une telle liste en la convertissant en versions non génériques des interfaces ICollection, IList, IEnumerable.

+0

Ouais, je pensais que cela pourrait être le cas. Je consomme la liste d'une méthode () ailleurs dans le système, donc je ne peux pas créer la liste à partir de zéro. Merci de votre aide! –

+0

Vous pouvez également appeler une méthode générique en utilisant la réflexion, mais vous aurez toujours les mêmes problèmes avec le résultat. Consultez cet article sur l'invocation de méthode générique dynamique: http://www.codeproject.com/KB/dotnet/InvokeGenericMethods.aspx – max

0

Vous devez dire que ce type qui est listType

var list = _repository.Query<typeof(listType)>().ToList(); 
+0

Désolé, mais c'est déjà un type. typeof() est utilisé pour convertir le nom d'une classe, d'une interface, etc. (c'est-à-dire comme si vous alliez accéder à une méthode statique dessus). –

+0

Vous avez raison. – MQS

Questions connexes