2011-02-05 2 views
4

간단히 말하면 프로젝트의 모든 네임 스페이스를 재귀 적으로 사용하고 이전에 발견 된 모든 네임 스페이스에서 사용할 수있는 클래스를 원합니다.네임 스페이스 내의 모든 네임 스페이스를 재귀 적으로 얻는 방법

var namespaces = assembly.GetTypes() 
        .Select(ns => ns.Namespace); 

내가 문자열 형식의 네임 스페이스를 얻을이 부분 이전 사용하고 있습니다. 하지만 이제 기본 네임 스페이스도 알게되었습니다. 당신이 네임 스페이스의 클래스에 Lookup을 할 수 있습니다 처럼

답변

4

그것은 소리 :

var lookup = assembly.GetTypes().ToLookup(t => t.Namespace); 

또는 대안 (매우 유사하게) 당신이 사용할 수 GroupBy : 예를 들어

var groups = assembly.GetTypes().GroupBy(t => t.Namespace); 

:

var groups = assembly.GetTypes() 
        .Where(t => t.IsClass) // Only include classes 
        .GroupBy(t => t.Namespace); 
foreach (var group in groups) 
{ 
    Console.WriteLine("Namespace: {0}", group.Key); 
    foreach (var type in group) 
    { 
     Console.WriteLine(" {0}", t.Name); 
    } 
} 

그러나 그게 당신이 겪은 일이 아닐지는 확실하지 않습니다. 각 네임 스페이스의 클래스를 가져올 수는 있지만 실제로 찾고있는 클래스인지는 알 수 없습니다. 마음에 부담

두 지점 :

  • 하지 정말 형태의 계층 구조를, 멀리 CLR와 관련된 어떠한 일이
  • 네임 스페이스에 대한 재귀 어디에도 없습니다. "기본"네임 스페이스와 같은 것은 없습니다. 에는 C# 언어가에 대한 규칙이 있지만 CLR에 관한 한 "부모"네임 스페이스는 없습니다.

당신이 정말는 "Foo.Bar"에서 "Foo.Bar.Baz"와 "푸"다음과 같이 사용할 수 있습니다에서 가고 싶은 경우

while (true) 
{ 
    Console.WriteLine(ns); 
    int index = ns.LastIndexOf('.'); 
    if (index == -1) 
    { 
     break; 
    } 
    ns = ns.Substring(0, index); 
} 
+0

@ 존 소총을 : 감사 너 너무 많이. 특히 .Net에 대한 지식은 훌륭합니다. 나는 너의 학생이되고 싶다. :) – Prakash

+0

@ 존 Skeet : 나는 또한 반사에 대해 더 알고 싶다. 나는 일찌감치 반사를 과소 평가했다. 그래서 나는 이것에 대해 더 알고 싶다. 이 주제에 대한 실험 지식을 얻을 수있는 방법이 있습니까? 나는 하나의 방법을 알고있다. :) 근원이 있으면 저를 건의하십시오. – Prakash

+0

@Prakash : 솔직히 말해서, 반성에 관해서는 정말 좋은 선택입니다. Type 및 MethodInfo와 같은 모든 요소를 ​​살펴보고 유용 할 수있는 위치를 생각해보십시오. –

관련 문제