2014-05-16 32 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

相關問題