2011-11-09 67 views
2

我在寫一個通用的方法,以檢索的廣告組或用戶,可以是兩種類型中的一個的參數的一個問題 - 要麼System.DirectoryServices.AccountManagement GroupPrincipalUserPrincipalC#通用方法

的方法是如下: -

private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) 
{ 
    PrincipalSearcher ps = new PrincipalSearcher(); 
    ps.QueryFilter = GroupOrUserPrincipal; 

    etc......... 
} 

問題是GroupOrUserPrincipal是顯示以下錯誤: -

Cannot implicitly convert type 'T' to System.DirectoryServices.AccountManagement.Principal

我只能對d這或我錯過了什麼?

+3

快速的問題。你爲什麼不爲組寫一個方法,爲用戶寫另一個方法? –

+0

這就是我所做的,但只是想用一種方法簡化它 - 這種方法中有更多的代碼,所以真的是爲了避免重複。 – cyberbobcat

+0

GroupPrincipal和UserPrincipal來自Principal? – Tudor

回答

7

您應該限制T到類型,你的方法是有道理的:

private static IENumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) 
     where T : Principal 
{ 
     // ..... 

阻止的GetGroupsOrUsers<int>電話,讓T被隱式轉換爲Principal,修復你的錯誤(或者我希望)。

+0

這已經解決了問題 - 謝謝。 – cyberbobcat

+0

非常酷。從來沒有想過要這樣做。你知道Pro和Con的使用方法嗎? –

+0

@thats_how_i_feel:你可以在http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic4上閱讀更多關於此的內容。我不知道任何缺點,專業人員大多是類型安全和可重用性。 – Jens

0

你必須寫在這條線投:

ps.QueryFilter = (Principal) GroupOrUserPrincipal; 
2

您需要指定一個type parameter constraint;例如:

private static IEnumerable<string> GetGroupsOrUsers<T>(T GroupOrUserPrincipal) where T: Principal 

這限制了可用於爲T只類Principal型或Principal一個子類的類。然後C#編譯器知道傳遞給GetGroupsOrUsers(...)的所有內容都是與Principal兼容的類型,並且不會再出錯。

2

可能你想看看Generic Contraints特別是一個派生的約束,其中你的各種T對象都暗示給定的interterface。例如

where T : Principle