2012-09-16 4 views
3

이 코드는 System.Collections를 호출 할 때 어떤 네임 스페이스도 반환하지 않습니다.System.Collections 어셈블리에서 네임 스페이스 목록을 반환하는 방법은 무엇입니까?

public static List<string> GetAssemblyNamespaces(AssemblyName asmName) 
{ 
    List<string> namespaces = new List<string>(); 
    Assembly asm = Assembly.Load(asmName); 

    foreach (Type typ in asm.GetTypes()) 
    if (typ.Namespace != null) 
     if (!namespaces.Contains(typ.Namespace)) 
     namespaces.Add(typ.Namespace); 

    return namespaces; 
} 

왜 그렇습니까? System.Collections에는 형식이 있습니다. 대신 네임 스페이스를 얻으려면 어떻게해야합니까?

답변

0
var namespaces = assembly.GetTypes() 
         .Select(t => t.Namespace) 
         .Distinct(); 

을 사용하면 LINQ을 사용하면 assemly의 네임 스페이스를 얻을 수 있습니다.

+0

에 정의되어 있기 때문에

var assemblies = new List<AssemblyName>(Assembly.GetEntryAssembly().GetReferencedAssemblies()); assemblies.Add(Assembly.GetEntryAssembly().GetName()); var nss = assemblies.Select(name => Assembly.Load(name)) .SelectMany(asm => asm.GetTypes()) .Where(type=>type.Namespace!=null) .Where(type=>type.Namespace.StartsWith("System.Collections")) .Select(type=>type.Namespace) .Distinct() .ToList(); 

예를 들어, System.Collections.MyCollections을받지 않습니다. System.Collections 어셈블리에 대해 여전히 0 네임 스페이스를 반환해야합니다. – user1675878

1

다른 어셈블리에는 동일한 (또는 하위) 네임 스페이스가 포함될 수 있습니다. 예를 들어 A.dll에는 A 네임 스페이스가 포함될 수 있으며 B.dll에는 A.B이 포함될 수 있습니다. 따라서 네임 스페이스를 찾을 수 있으려면 모든 어셈블리를로드해야합니다.

트릭을 할 수 있지만, 그것은 여전히 ​​공간이되지-참조하지 사용되는 조립 될 수있는 문제점이있다. 당신은 위의 코드를 실행하면이 내 테스트 코드 SO.exe : 코드를 작성하는 또 다른 방법

+0

그러나 System.Collections.dll의 네임 스페이스 만 원한다면 다른 어셈블리를로드해야하는 이유는 무엇입니까? 설명서 (.NET 4.5)에 따르면이 어셈블리에는 다섯 개의 네임 스페이스 (System.Collections, System.Collections.Concurrent, System.Collections.Generic, System.Collections.ObjectModel, System.Collections.Specialized)가 포함되어 있습니다. 당신은 그들이 System.Collections.dll에 없다는 것을 의미합니까? 그러나 System.Collections.dll에 의해 참조되는 다른 어셈블리 에서요?! 그러나 주된 질문은 실제로 GetTypes()가 어떤 유형도 반환하지 않는 이유입니다. System.Collections.dll에는 ArrayList, Stack 등의 형식이 있습니다. – user1675878