네임 스페이스 내의 모든 클래스를 얻으려면 어떻게해야합니까?


답변:


142

당신은 그것을 "뒤로"해야 할 것입니다; 어셈블리의 모든 형식을 나열한 다음 각 형식의 네임 스페이스를 확인합니다.

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

사용 예 :

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

Assembly.GetExecutingAssembly()사용할 수없는 .Net 2.0 이전의 경우 어셈블리를 가져 오려면 작은 해결 방법이 필요합니다.

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

2
어디에요 (t => String.Equals (t.Namespace, 네임 스페이스 StringComparison.Ordinal)
abatishchev

8
또한 Assembly! = namespace-일부 네임 스페이스는 여러 어셈블리에 분산되어 있습니다.
Bevan

1
그리고 IEnumerable <Type> 만 반환하지 않는 이유는 무엇입니까? 더구나 결과 사이에 열거를하면 'for'대신 'foreach'가 더 좋다고 생각합니다.
abatishchev

2
좋은 의견, 감사합니다. 반환 형식을 IEnumerable <Type>으로 만들면 마지막 ToArray 호출이 필요하지 않습니다. 하지만 'foreach'가 'for'보다 낫다는 데 동의하는지 확실하지 않습니다. 보시다시피 성능 차이는 무시할 수있는 정도라서 개인적인 스타일로 귀결되는 것 같아요. 그러나 'foreach'를 선호하는 좋은 주장이있을 수 있습니다. 그렇다면 자유롭게 공유하십시오. 나는 틀린 것으로 증명되는 것을 좋아한다 :)
Fredrik Mörk 2009-06-04

3
나는 foreach가 개인적으로보기가 더 쉽다고 생각합니다. 이면에서 두 루프는 성능면에서 거의 동일합니다.
Chev

5

좀 더 많은 정보를 제공해야합니다 ...

리플렉션을 사용한다는 뜻입니까? 어셈블리 매니페스트를 반복하고 다음을 사용하여 형식 목록을 가져올 수 있습니다.

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

Visual Studio에만있는 경우 인텔리 센스 창에서 목록을 가져 오거나 개체 브라우저 (CTRL + W, J)를 열어서 가져올 수 있습니다.


0

Reflection을 사용하면 어셈블리의 모든 유형을 반복합니다. 유형에는 관심있는 네임 스페이스 만 필터링하는 데 사용하는 Namespace 속성이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.