2011-11-09 11 views
2

私は2つのタイプのいずれかになります。パラメータを指定してADグループまたはユーザーを検索するための汎用的な方法を書いて、問題を抱えているとの一般的な方法次のように: - :C#複数の種類の一つのパラメータ

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

は、私はDにはできます -

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

    etc......... 
} 

問題はGroupOrUserPrincipalは、次のエラーを示しているですこれは何か不足していますか?

+3

クイック質問。なぜグループのためのメソッドとユーザーのためのメソッドを書くのですか? –

+0

これは私がやったことですが、ちょうど1つの方法を使用してそれを合理化したかったのです - このメソッドにはもっとコードがありますので、本当に重複を避けることでした。 – 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 

これはタイプPrincipal又はPrincipalのサブクラスのクラスのみにTとして用いることができるクラスを制限します。 C#コンパイラは、GetGroupsOrUsers(...)に渡されたすべてがPrincipalと互換性のある型であり、もはやエラーにならないことを知っています。

2

おそらくGeneric Contraintsを見てみると、いろいろなTオブジェクトがすべて与えられたインターフェースを援用する派生制約である可能性があります。例:

where T : Principle 
関連する問題