3

このコードは、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 には型があります。名前空間を取得する代わりに何ができますか?

4

2 に答える 2

1

異なるアセンブリには、同じ (またはサブ) 名前空間が含まれる場合があります。for exA.dllには名前空間が含まれる場合があり、AB.dll含まれる場合がありますA.B。したがって、名前空間を見つけるには、すべてのアセンブリをロードする必要があります。

これでうまくいくかもしれませんが、名前空間が参照されていない、使用されていないアセンブリにある可能性があるという問題がまだあります。

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、テストコードで定義されているため取得できませんSO.exe:)

于 2012-09-16T17:06:47.623 に答える
0
var namespaces = assembly.GetTypes()
                         .Select(t => t.Namespace)
                         .Distinct();

を使用LINQすると、アセンブリの名前空間を取得できます。

于 2012-09-16T16:15:11.067 に答える