it-swarm-vi.tech

Bắt tất cả các loại trong một không gian tên thông qua sự phản chiếu

Làm thế nào để bạn có được tất cả các lớp trong một không gian tên thông qua sự phản chiếu trong C #?

243
Chethan

Mã sau in tên của các lớp trong namespace được chỉ định trong Hội đồng hiện tại.
[.___.

string nspace = "...";

var q = from t in Assembly.GetExecutingAssembly().GetTypes()
        where t.IsClass && t.Namespace == nspace
        select t;
q.ToList().ForEach(t => Console.WriteLine(t.Name));
295
aku

Như FlySwat nói, bạn có thể có cùng một không gian tên trải dài trong nhiều cụm (ví dụ: System.Collections.Generic). Bạn sẽ phải tải tất cả các hội đồng đó nếu chúng chưa được tải. Vì vậy, để có một câu trả lời đầy đủ:

AppDomain.CurrentDomain.GetAssemblies()
                       .SelectMany(t => t.GetTypes())
                       .Where(t => t.IsClass && t.Namespace == @namespace)

Điều này sẽ hoạt động trừ khi bạn muốn các lớp của các miền khác. Để có danh sách tất cả các tên miền, hãy theo dõi liên kết này.

69
nawfal
using System.Reflection;
using System.Collections.Generic;
//...

static List<string> GetClasses(string nameSpace)
{
    Assembly asm = Assembly.GetExecutingAssembly();

    List<string> namespacelist = new List<string>();
    List<string> classlist = new List<string>();

    foreach (Type type in asm.GetTypes())
    {
        if (type.Namespace == nameSpace)
            namespacelist.Add(type.Name);
    }

    foreach (string classname in namespacelist)
        classlist.Add(classname);

    return classlist;
}

NB: Đoạn mã trên minh họa những gì đang diễn ra. Nếu bạn thực hiện nó, một phiên bản đơn giản hóa có thể được sử dụng:

using System.Linq;
using System.Reflection;
using System.Collections.Generic;
//...

static IEnumerable<string> GetClasses(string nameSpace)
{
    Assembly asm = Assembly.GetExecutingAssembly();
    return asm.GetTypes()
        .Where(type => type.Namespace == nameSpace)
        .Select(type => type.Name);
}
21
Ryan Farley

Đối với một hội cụ thể, NameSpace và ClassName:

var assemblyName = "Some.Assembly.Name"
var nameSpace = "Some.Namespace.Name";
var className = "ClassNameFilter";

var asm = Assembly.Load(assemblyName);
var classes = asm.GetTypes().Where(p =>
     p.Namespace == nameSpace &&
     p.Name.Contains(className) 
).ToList();

Lưu ý: Dự án phải tham khảo hội

15
John Peters

Đây là một sửa chữa cho các lỗi LoaderException mà bạn có thể tìm thấy nếu một trong các kiểu con một kiểu trong một hội khác:

// Setup event handler to resolve assemblies
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);

Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);
a.GetTypes();
// process types here

// method later in the class:
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

Điều đó sẽ giúp với các loại tải được xác định trong các hội đồng khác.

Mong rằng sẽ giúp!

12
tsimon

Bạn sẽ không thể có được tất cả các loại trong một không gian tên, bởi vì một không gian tên có thể kết nối nhiều tập hợp, nhưng bạn có thể nhận tất cả các lớp trong một hội và kiểm tra xem chúng có thuộc không gian tên đó không.

Assembly.GetTypes() hoạt động trên Hội đồng địa phương hoặc bạn có thể tải một Hội đồng trước sau đó gọi GetTypes() trên đó.

9
FlySwat

Giống như @aku trả lời, nhưng sử dụng các phương thức mở rộng:

string @namespace = "...";

var types = Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => t.IsClass && t.Namespace == @namespace)
    .ToList();

types.ForEach(t => Console.WriteLine(t.Name));
5
JoanComasFdz

Nhận tất cả các lớp theo một phần của tên không gian chỉ trong một hàng:

var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
5
Ivo Stoyanov

Không gian tên thực sự khá thụ động trong thiết kế thời gian chạy và chủ yếu phục vụ như các công cụ tổ chức. Tên đầy đủ của một loại trong .NET bao gồm Không gian tên và Class/Enum/Etc. kết hợp. Nếu bạn chỉ muốn đi qua một hội cụ thể, bạn chỉ cần lặp qua các kiểu được trả về bởi hội . GetExportedTypes () kiểm tra giá trị của loại . Không gian tên . Nếu bạn đang cố gắng đi qua tất cả các hội đồng được tải trong AppDomain hiện tại, nó sẽ liên quan đến việc sử dụng AppDomain.CienDomain . GetAssemblies ()

3
TheXenocide
//a simple combined code snippet 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace MustHaveAttributes
{
  class Program
  {
    static void Main ( string[] args )
    {
      Console.WriteLine ( " START " );

      // what is in the Assembly
      Assembly a = Assembly.Load ( "MustHaveAttributes" );
      Type[] types = a.GetTypes ();
      foreach (Type t in types)
      {

        Console.WriteLine ( "Type is {0}", t );
      }
      Console.WriteLine (
         "{0} types found", types.Length );

      #region Linq
      //#region Action


      //string @namespace = "MustHaveAttributes";

      //var q = from t in Assembly.GetExecutingAssembly ().GetTypes ()
      //        where t.IsClass && t.Namespace == @namespace
      //        select t;
      //q.ToList ().ForEach ( t => Console.WriteLine ( t.Name ) );


      //#endregion Action  
      #endregion

      Console.ReadLine ();
      Console.WriteLine ( " HIT A KEY TO EXIT " );
      Console.WriteLine ( " END " );
    }
  } //eof Program


  class ClassOne
  {

  } //eof class 

  class ClassTwo
  {

  } //eof class


  [System.AttributeUsage ( System.AttributeTargets.Class |
    System.AttributeTargets.Struct, AllowMultiple = true )]
  public class AttributeClass : System.Attribute
  {

    public string MustHaveDescription { get; set; }
    public string MusHaveVersion { get; set; }


    public AttributeClass ( string mustHaveDescription, string mustHaveVersion )
    {
      MustHaveDescription = mustHaveDescription;
      MusHaveVersion = mustHaveVersion;
    }

  } //eof class 

} //eof namespace 
2
Yordan Georgiev

Kha đơn gảin

Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}
2
Antonio Lopes