2013-02-20 65 views
5

Tôi cần phải 'quét' AppDomain đang hoạt động cho tất cả các assembly được nạp vào thời gian chạy và nhận danh sách các không gian tên duy nhất có sẵn trong các assembly đó, .NET có hỗ trợ không?Lấy danh sách tất cả các không gian tên có sẵn trong AppDomain

Mã phải được thực thi trong thời gian chạy, sao cho mã động.

Tôi vừa mới bắt đầu viết mã trong C#, vì vậy tôi không chắc chắn về nơi bắt đầu, vì vậy mọi trợ giúp sẽ được đánh giá cao.

+0

Nếu bạn mới bắt đầu học C#, hãy lưu phản ánh và các nội dung nâng cao khác để sử dụng sau này. Ý kiến ​​của tôi tất nhiên. – gdoron

+0

Tôi đã làm việc với c/C++ và lắp ráp trong 20 năm qua, vì vậy tôi không phải là một noob hoàn chỉnh, phải bắt đầu một nơi nào đó :) – jjdev80

Trả lời

2

Như một vấn đề thực tế tôi đã viết một số mã cho phép bạn làm điều đó một vài ngày trước.

Sử dụng lớp này:

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; 
     } 
    } 

Cách sử dụng:

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

Thưởng thức!

+0

Đó chính xác là những gì tôi cần, cảm ơn bạn! – jjdev80

4

Bắt đầu từ AppDomain (AppDomain.CurrentDomain có thể) và gọi GetAssemblies. Trên mỗi lắp ráp lặp qua các types nó xác định, theo dõi trong đó namespace mỗi người là ở

Là một ví dụ về cách dễ dàng là để làm điều này với LINQ xem xét việc này:.

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

cảm ơn bạn vm :) – jjdev80

Các vấn đề liên quan