2014-05-16 106 views
1

我使用泛型坚持的IEnumerable的IEnumerable的正确使用<T>

我有一个基类的

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

那里有两个派生类

public class User : DirectoryObject 
    { 
     ... 
    } 

    public class Group : DirectoryObject 
    { 
     ... 
    } 

我原本用了两个单独获取用户和组对象的方法...

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


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

写了很多重复的用户和组的组合之后,我意识到,我可能只是一个通用的,像这样结合起来...

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

但是我无法在这里将这一细分市场为通用的IEnumerable ...

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>(); 
    } 

我的线沿线的思考...

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

但我无法得到它编译,我觉得我失去了一些明显的东西,但我现在正在绘制空白。该错误是发生在这里:

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

回答

2

您需要指定方法名称后泛型类型参数,这使得这种方法generic.Or你必须把这种方法引入其中T被指定为通用参数通用类否则编译器不知道T是什么。

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

+1那么,不是“那么好”,因为它是在它实际指定的方法名称之后。在其他地方,它只是用于(至少从方法的角度来看,从返回类型的角度来看,它自然是在返回类型中指定的)。 – Guffa

+0

@ Selman22 - 谢谢。这消除了我的编译器错误! – Svek

+0

@Guffa - 我刚刚注意到您对“GetUsers()”的用法作为方法名称所说的话。我只是想先让编译器出错,我甚至没有意识到命名不准确。也谢谢你! – Svek

0

您不能在非泛型方法上声明“where”约束。尽管GetUsers()的返回类型是通用的IEnumerable<T>,但该方法没有类型参数,因此不知道什么是T

您可以创建一个“直通”通用类来缓解这一问题,并指定你的约束:

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

此类指定什么T是创作,因此允许非泛型函数GetUsers()返回IEnumerable<T>

+0

哎呀,刚才看到已经有一个被接受的答案了...... – CoolBots

相关问题