2011-11-09 3 views
2

나는 두 가지 유형 중 하나가 될 수있는 매개 변수를 사용하여 AD 그룹 또는 사용자를 검색하는 일반적인 방법을 쓰는 문제에 봉착 - 방법은 하나 System.DirectoryServices.AccountManagement GroupPrincipal 또는 UserPrincipalC#을 일반적인 방법

을 다음과 같습니다 : -

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에 내가 수 있어요 이거 내가 놓친거야? 당신은 유형에 T을 제한해야

ps.QueryFilter = (Principal) GroupOrUserPrincipal; 
+3

빠른 질문. 그룹에 대해 하나의 메소드를 작성하고 사용자에 대해 하나의 메소드를 작성하십시오. –

+0

그게 내가 한 일이지만 단지 한 가지 방법을 사용하여 조금 간소화하고 싶었습니다.이 방법에 더 많은 코드가 있으므로 실제로는 중복을 피하는 것이 었습니다. – cyberbobcat

+0

GroupPrincipal 및 UserPrincipal은 Principal에서 파생됩니까? – Tudor

답변

7

당신의 방법에 대한 의미가 있습니다 :

+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

는이 라인에 캐스팅 작성해야 GetGroupsOrUsers<int>의 호출을 방지

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

을하고 T을 할 수 있습니다 암시 적으로 Principal으로 변환하여 오류를 수정하십시오.

2

type parameter constraint을 지정해야합니다. 예 :

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

이 유형 PrincipalPrincipal 또는 서브 클래스의 클래스 T로 사용될 수있는 클래스를 제한한다. C# 컴파일러는 GetGroupsOrUsers(...)에 전달 된 모든 내용이 Principal과 호환되는 형식이므로 더 이상 오류가 발생하지 않는다는 것을 알고 있습니다.

2

Generic Contraints을 보길 원할 것입니다. 특히 다양한 T 객체가 모두 주어진 인터페이 스를 의미하는 파생 구속 조건을보고 싶을 수 있습니다. 예 :

where T : Principle