c#从.dll获取所有名称空间

Bla*_*axx 3 c# assemblies

在DLL(GUI)中,我需要获取当前Application中所有命名空间的List(例如,如果我将该DLL绑定到名为"Hundekuchen"的Project中,它应该列出

{ "GUI", "Hundekuchen" }
Run Code Online (Sandbox Code Playgroud)

这有什么内置功能吗?

car*_*ira 11

没有内置函数,但您可以枚举程序集中的类型,并获取它们的名称空间.

        Assembly asm = typeof(MyApplication).Assembly;
        List<string> namespaces = new List<string>();
        foreach (var type in asm.GetTypes())
        {
            string ns = type.Namespace;
            if (!namespaces.Contains(ns))
            {
                namespaces.Add(ns);
            }
        }

        foreach (var ns in namespaces)
        {
            Console.WriteLine(ns);
        }
Run Code Online (Sandbox Code Playgroud)

  • `asm.GetTypes().选择(type => type.NameSpace).Distinct()`更简洁,性能更好,因为`List.Contains()`是O(n),而`Distinct`应该使用hashset为此(所以有效地是O(1)). (3认同)
  • 请注意,您可以使用哈希逻辑而不使用linq,方法是使用HashSet <>而不是List <>.太多程序员忽略了这种可能性. (2认同)

Pet*_*les 6

您可以获取AppDomain中所有程序集的列表,然后获取所有已加载程序集中的所有类,但是您必须过滤掉您不希望看到的程序集,因为mscorlib和System库中链接了许多程序集. .这是一个快速而肮脏的(使用.NET 3.5) - 如果您链接其他您不想看到的库,则可能需要过滤掉一些:

    var enumerable = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(assembly => assembly.GetTypes())
        .Select(type => type.Namespace)
        .Distinct()
        .Where(name => name != null &&
                       !name.StartsWith("System") &&
                       !name.StartsWith("Microsoft") &&
                       !name.StartsWith("MS.") &&
                       !name.StartsWith("<"));
Run Code Online (Sandbox Code Playgroud)