2013-04-10 2 views
-1

C#/.NET 3.5 응용 프로그램을 개발 중이며 해당 .NET 버전에 머물고 싶습니다. 리플렉션을 사용하여이 문제를 해결하는 방법을 파악할 수 없습니다. 해결 방법을 찾았지만 "깔끔한"것은 아닙니다. 아래 코드와 같이 모든 인터페이스 구현을 찾아야하므로 앞으로 추가 인터페이스 구현을 추가 할 때 기존 코드를 변경할 필요가 없습니다.Reflection을 사용하여이 문제를 해결하는 방법 ...? (C# /. NET)

interface Ii { } 
class A : Ii { } 
class A1 : A { } 
class A2 : A { } 
class A3 : A { } 
class B : Ii { } 
class C : Ii{ } 
// maybe in future class D : Ii { } 
// maybe in future class E : Ii { } 

class Helper 
{ 
    static List<Type> GetAllInterfaceImplemenations() 
    {// do reflection magic and return ["A1","A2","A3","B","C"] ... 
    // I will use this method to fill comboBox-es , create objects factory, etc... 
    // there should be no changes if/when in future I add class D etc. 
    } 
} 
+1

유형을 사용하여 작업해야하므로 ArrayList를 사용하지 않아야합니다. 더 나은 사용 목록 CSharpie

+0

비슷한 질문이 여기에 요청되었습니다, 당신은 내 대답을 좀 걸릴 수 있습니다 : http://stackoverflow.com/questions/13994579/how-can-i-use-reflection-or-alternative-to -create-function-calls-programatically/13994668 # 13994668 – user287107

답변

5

이 시도 : 위의 솔루션을

public static List<string> GetAllInterfaceImplemenations() 
{ 
    var interfaceType = typeof(Ii); 
    var list = new List<string>(); 
    foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) 
    { 
     if (type.IsClass && interfaceType.IsAssignableFrom(type)) 
     { 
      list.Add(type.Name); 
     } 
    } 

    return list; 
} 
+0

-1 for Arraylist – CSharpie

+1

괜찮아요. 이제 List 을 사용합니다. – Dan

+0

문자열 목록 (ClassNames)이 필요했지만 문제가되지 않습니다. –

0

문제가 원하는되지 않는, 위의 예에서 클래스 "A"를 반환하는 것입니다. "리프"만이 필요합니다. 그러나 위의 솔루션은이를 해결하는 방법을 제시합니다. 그래서, 여기에 내 생산 솔루션입니다 (미안 해요, ArrayList 내 좋아하는 컬렉션입니다 ...).

private static ArrayList GetAllInterfaceImplemenations() 
{ 
    ArrayList listOfLeafsNames = null; 
    try 
    { 
     Type interfaceType = typeof(ISpeechCodec); 
     ArrayList listOfAll = new ArrayList(); 
     foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) 
     { 
      if (type.IsClass && interfaceType.IsAssignableFrom(type)) 
      { 
       listOfAll.Add(type); 
      } 
     } 

     listOfLeafsNames = new ArrayList(); 
     foreach (Type typeCandidate in listOfAll) 
     { 
      bool isLeaf = true; 
      foreach (Type type2 in listOfAll) 
      { 
       if (!(typeCandidate.Equals(type2))) 
       { 
        if (typeCandidate.IsAssignableFrom(type2)) 
        { 
         isLeaf = false; 
        } 
       } 
      } 
      if (isLeaf) 
      { 
       listOfLeafsNames.Add(typeCandidate.FullName); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Setup_TraceExceptions(ex.ToString()); 
    } 

    return listOfLeafsNames; 
} 
+0

클래스 A를 추상으로 표시하는 방법은 무엇입니까? 그것은 생성되지 않아야하는 클래스와 그렇지 않은 클래스를 구별하는 명확한 방법이 될 것입니다. – user287107

관련 문제