2010-06-21 3 views
6

Assmbly.GetTpes() 어셈블리의 형식을 가져옵니다. 그러나 중첩 클래스 (OrderLine)도 원한다면 어떻게해야합니까? 클래스 이름이 아닌 어셈블리 이름 만 알고 있으므로 GetType (Order + OrderLine)이 작동하지 않습니다.중첩 클래스의 Assembly.GetTypes()

public class Order 
{ 
    public class OrderLine 
    { 
    } 
} 
+0

궁금한 점은'assembly.GetTypes()'에서 중첩 된 타입을 찾았습니까, 아니면'type.GetNestedTypes()'만 호출하여 찾을 수 있었습니까? – Greg

답변

6

나도 몰라. 가정하지 않으면 다음과 같은 메서드를 사용하여 모든 어셈블리 유형을 반복 할 수 있습니다.

IEnumerable<Type> AllTypes(Assembly assembly) 
{ 
    foreach (Type type in assembly.GetTypes()) 
    { 
     yield return type;   
     foreach (Type nestedType in type.GetNestedTypes()) 
     { 
      yield return nestedType; 
     } 
    } 
} 

편집 :
MSDN has the followingAssembly.GetTypes

반환되는 배열은 중첩 된 유형이 포함 말할 수 있습니다.

정말 위의 대답은 필요하지 않습니다. Assembly.GetTypes에 의해 OrderOrder+OrderLine이 유형으로 반환되어야합니다.

+0

중첩 된 유형에서 중첩 된 유형을 선택하지 않습니다. 그러나 정말로, 누가 그것을합니까? –

+2

@Stefan - 중첩 된 중첩 된 중첩 형식을 검색하는 것은 독자에게 남겨진 재귀의 연습입니다 – Greg

0

LINQ 문을 사용할 수 있습니다. 나는 당신이 뭘하려고하는지 100 % 확신하지는 못했지만 이런 식으로 할 수 있습니다. 일반 Assembly.GetTypes()이 중첩 클래스를 반환하지 않을 경우 편집

Assembly.GetTypes().Where(type => type.IsSubclassOf(SomeType) && type.Whatever); 

, 당신은 배열을 반복하고 배열에 에서 찾을 모든 것을 추가 할 수 있습니다. 같은 이런

var allTypes = new List<Type>(); 
var types = Assembly.GetTypes(); 
allTypes.AddRange(types); 
foreach(var type in types) 
{ 
    allTypes.AddRange(type.GetNestedTypes()); 
} 
+2

중첩 클래스는 반드시 하위 클래스 일 필요는 없으며 서브 클래스는 중첩되지 않아도됩니다. 이것은 구두꾼이 원하는 것을하지 않습니다. – Greg

+0

@Greg 나는 LINQ 문을 예로 보여주었습니다. –

4

뭔가 : assembly.GetTypes() 중첩 클래스를 포함하도록되어있는 경우


Assembly.GetTypes().SelectMany(t => new [] { t }.Concat(t.GetNestedTypes()));
+1

Ooh, SelectMany. * 정보를 흡수하기 위해 MSDN으로 이동합니다. * –

관련 문제