2013-02-20 68 views
5

我需要在运行时为所有加载的程序集“扫描”活动AppDomain并获得这些程序集中可用的唯一名称空间的列表,.NET是否支持这些名称空间?获取AppDomain中所有可用名称空间的列表

代码必须在运行时执行,以便代码是动态的。

我刚刚开始在C#中编写代码,所以我有点不确定从哪里开始,所以任何帮助将不胜感激。

+0

如果您刚开始学习C#,稍后保存反射和其他高级内容。我的意见当然。 – gdoron 2013-02-20 09:42:33

+0

过去20年来我一直在使用c/C++和assembly,所以我不是一个完整的noob,需要从某处开始:) – jjdev80 2013-02-20 09:45:28

回答

2

作为事事实上,我写了一些代码,可以让你在几天前做到这一点。

使用此类

public class NSScanner 
    { 
     public static List<Type> GetLoadedTypes(AppDomain appDomain) 
     { 
      return _getLoadedTypes(appDomain); 
     } 

     public static List<Type> GetPublicLoadedTypes(AppDomain appDomain) 
     { 
      return _getLoadedTypes(appDomain, true); 
     } 

     public static List<string> GetUniqueNamespaces(IEnumerable<Type> types) 
     { 
      var uniqueNamespaces = new ConcurrentBag<string>(); 

      Parallel.ForEach(types, type => 
      { 
       if (!uniqueNamespaces.Contains(type.Namespace) && !string.IsNullOrEmpty(type.Namespace)) 
        uniqueNamespaces.Add(type.Namespace); 
      }); 

      var sortedList = uniqueNamespaces.OrderBy(o => o).ToList(); 

      return sortedList; 
     } 


     private static List<Type> _getLoadedTypes(AppDomain appDomain, bool onlyPublicTypes = false) 
     { 
      var loadedAssemblies = appDomain.GetAssemblies(); 

      var loadedTypes = new List<Type>(); 

      Parallel.ForEach(loadedAssemblies, asm => 
      { 
       Type[] asmTypes; 
       if (onlyPublicTypes) 
        asmTypes = asm.GetExportedTypes(); 
       else 
        asmTypes = asm.GetTypes(); 

       loadedTypes.AddRange(asmTypes); 
      }); 

      return loadedTypes; 
     } 
    } 

使用

var publicLoadedTypes = NSScanner.GetPublicLoadedTypes(AppDomain.CurrentDomain); 
var namespaces = NSScanner.GetUniqueNamespaces(publicLoadedTypes); 

享受!

+0

这正是我需要的,谢谢! – jjdev80 2013-02-20 09:48:28

4

AppDomainAppDomain.CurrentDomain也许)开始并致电GetAssemblies。在每个装配遍历它定义了types,跟踪其中namespace每一个都是在

由于是多么容易与LINQ做到这一点考虑这样一个例子:

var namespaces = AppDomain.CurrentDomain 
        .GetAssemblies() 
        .SelectMany(a => a.GetTypes()) 
        .Select(t => t.Namespace) 
        .Distinct() 
        // optionally .OrderBy(ns => ns) here to get sorted results 
        .ToList(); 
+0

谢谢vm :) – jjdev80 2013-02-20 10:00:41

相关问题