2014-05-16 3 views
1

Je suis coincé à l'aide des génériques avec IEnumerableutilisation correcte de IEnumerable <T>

J'ai une classe de base de

public class DirectoryObject //Microsoft.Azure.ActiveDirectory.GraphClient 
    { 
     ... 
    } 

où il y a deux classes dérivées

public class User : DirectoryObject 
    { 
     ... 
    } 

    public class Group : DirectoryObject 
    { 
     ... 
    } 

J'avais initialement utilisé deux méthodes séparées pour obtenir les objets User et Group ...

public User GetUser(string objectId) 
    { 
     return _graphConnection.Get<User>(objectId); 
    } 


    public Group GetGroup(string objectId) 
    { 
     return _graphConnection.Get<Group>(objectId); 
    } 

Après avoir écrit beaucoup d'utilisateurs répétitifs et des combinaisons de groupe, je réalisais que je pouvais combiner avec un générique comme si ...

public T Get<T>(string objectId) where T : DirectoryObject 
    { 
     return _graphConnection.Get<T>(objectId); 
    } 

Mais je ne parviens pas à convertir ce segment ici dans un IEnumerable générique ...

public IEnumerable<User> ListUser() 
    { 
     PagedResults pagedResults = _graphConnection.List<User>(null, null); 
     return pagedResults.Results.OfType<User>(); 
    } 

    public IEnumerable<Group> ListGroup() 
    { 
     PagedResults pagedResults = _graphConnection.List<Group>(null, null); 
     return pagedResults.Results.OfType<Group>(); 
    } 

Je pensais le long des lignes de ...

public IEnumerable<T> List() where T : DirectoryObject 
    { 
     PagedResults pagedResults = _graphConnection.List<T>(null, null); 
     return pagedResults.Results.OfType<T>(); 
    } 

Mais je ne peux pas le compiler, j'ai l'impression qu'il me manque quelque chose d'évident, mais je dessine des blancs pour le moment. L'erreur se produit ici:

public IEnumerable<T> List() where T : DirectoryObject 

Répondre

2

Vous devez spécifier le paramètre de type générique après le nom de la méthode, qui fait cette méthode generic.Or vous devez mettre cette méthode dans une classe générique où T est spécifié en tant que paramètre générique Sinon, le compilateur n'a aucune idée de ce que le T est.

public IEnumerable<T> GetUsers<T>() where T : DirectoryObject 
+0

+1 Eh bien, pas "aussi bien", car c'est après le nom de la méthode qu'il est spécifié. Dans d'autres endroits, il est juste utilisé (au moins du point de vue de la méthode, du point de vue du type de retour, il est naturellement spécifié dans le type de retour). – Guffa

+0

@ Selman22 - Merci. Cela a fait disparaître mon erreur de compilation! – Svek

+0

@Guffa - Je viens de remarquer ce que vous disiez à propos de l'utilisation de "GetUsers()" comme nom de la méthode. J'essayais juste d'obtenir l'erreur du compilateur d'abord, je ne savais même pas que le nom n'était pas précis. Merci pour ça aussi! – Svek

0

Vous ne pouvez pas déclarer une contrainte «where» sur une méthode non générique. Même si le type de retour de GetUsers() est générique IEnumerable<T>, la méthode ne prend aucun paramètre de type, donc il n'y a aucune connaissance de ce qu'est T.

Vous pouvez créer une classe générique « pass-through » pour remédier à ce problème et de préciser votre contrainte:

public class GenericDirectoryObject<T> : DirectoryObject 
{ 
    public IEnumerable<T> GetUsers() 
    { 
     PagedResults pagedResults = _graphConnection.List<T>(null, null); 
     return pagedResults.Results.OfType<T>(); 
    } 
} 

Cette classe spécifie ce que T est sur la création, ce qui permet donc une fonction non-générique GetUsers() retourner IEnumerable<T>

+0

Oops, juste vu il y a déjà une réponse acceptée ... – CoolBots

Questions connexes