2016-09-23 1 views
0

Dans l'exemple ci-dessous, j'ai une méthode appelée GetList qui prend un paramètre de chaîne unique et retourne une liste d'entités. Je capture ceci dans une variable IEnumerable générique parce qu'à l'exécution je n'ai aucune idée quelle entité l'utilisateur peut vouloir. Comment puis-je utiliser le type réel au lieu de l'objet?IEnumerable du type de variable

Je veux remplacer ...

IEnumerable<object> data = GetList(entityName); 

Avec cette ...

IEnumerable<Company> data = GetList(entityName); 

La seule façon que je peux penser à manipuler en ce moment que je ne vais pas faire parce que nous avons plus de 300 entités est quelque chose comme

switch(entitName) 
{ 
    case "Company": 
    IEnumerable<Company> data = GetList(entityName); 
    break; 

    case "Employee": 
    IEnumerable<Employee> data = GetList(entityName); 
    break; 

    ... 
} 
+0

'GetList (entityName) .Cast ()' –

+0

Je ne sais pas ce sera la société si. Il peut s'agir d'un employé ou d'un rôle, etc. La seule information que j'ai est une chaîne (entityName) représentant l'entité qu'ils veulent interroger. – jjf1978

+0

Eh bien, dans ce cas, vous devriez garder votre objet. Le compilateur ne peut pas savoir pour vous non plus. Vous devrez faire un certain type de frappe pour savoir quel type vous utilisez alors. Ou vous aurez besoin de nous donner le contexte où votre code est exécuté pour nous permettre de trouver un travail. –

Répondre

2

Vous ne pouvez pas utiliser ce type de code conforme - il n'y a donc aucun moyen de le créer sans réflexion.

Le plus proche de ce que vous semblez vouloir est IEnumerable<dynamic> afin que vous puissiez accéder à la propriété de l'objet en fonction de son type d'exécution.

Si vous avez juste besoin de créer enumerable fortement typé pour retourner à un autre code s'attendant à mieux que IEnumerable<object> vous pouvez utiliser la réflexion pour créer un tel type (Create generic List<T> with reflection).

Vous pouvez également avoir une fonction générique qui donne des résultats de manière fortement typée mais au lieu de l'appeler directement par réflexion après avoir utilisé MakeGenericMethod avec le type correct (How do I use reflection to call a generic method?).

+1

Merci! Une vraie réponse au lieu de snark :) – jjf1978

0

Vous pouvez faire GetList() générique:

IEnumerable<Company> data = GetList<Company>(entityName); 

IEnumerable<T> GetList<T>(string entityName) 
{ 
    List<T> list = new List<T>(); 

    // Populate list here 

    return list; 
} 
+0

Je ne peux pas spécifier le type Parce que tout ce que je dois faire est une chaîne. L'utilisateur final clique sur une liste qui renvoie une chaîne à mon application puis l'application doit aller chercher cette entité. Donc, je ne peux pas hardcode GetList jjf1978

+2

Comment voulez-vous faire quelque chose de significatif avec la liste que vous obtenez si vous ne savez rien à ce sujet? – itsme86

+0

C'est exactement le problème. À propos de tout ce que je peux faire avec la liste retournée est databind. Je peux utiliser la réflexion pour regarder douloureusement toutes les propriétés mais je ne veux vraiment pas faire ça ... Fondamentalement, je veux un type variable – jjf1978