it-swarm-tr.com

Bir ad alanındaki tüm türleri yansıtma yoluyla alma

Bir isim alanındaki tüm sınıfları C # 'daki yansıma ile nasıl elde edersiniz?

245
Chethan

Aşağıdaki kod, geçerli derlemede tanımlanan namespace öğesindeki sınıfların adlarını yazdırır.
Diğerlerinin de belirttiği gibi, farklı modüller arasında bir ad alanı dağılabilir, bu yüzden önce bir montaj listesi almanız gerekir.

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));
297
aku

FlySwat'ın dediği gibi, birden çok montajda yayılan aynı ad alanına sahip olabilirsiniz (örneğin System.Collections.Generic). Zaten yüklü değilse, tüm bu düzenekleri yüklemeniz gerekecektir. Yani tam bir cevap için:

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

Diğer etki alanlarının sınıflarını istemediğiniz sürece bu çalışmalıdır. Tüm alan adlarının bir listesini almak için, this link.

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

Not: Yukarıdaki kod, neler olduğunu gösterir. Uygulamanız kolaylaştıysa, basitleştirilmiş bir sürüm kullanılabilir:

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);
}
22
Ryan Farley

Belirli bir Derleme için, NameSpace ve 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();

Not: Proje Meclise atıfta bulunmalıdır.

15
John Peters

İşte, türlerden birinin başka bir Montajda bir türü alt sınıflarda bulunup bulunmadığını bulmanız muhtemel LoaderException hataları için bir düzeltme:

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

Diğer montajlarda tanımlanan yükleme tiplerine yardımcı olmalıdır.

Umarım yardımcı olur!

12
tsimon

Bir ad alanındaki tüm türleri elde edemezsiniz, çünkü bir ad alanı birden fazla düzeneği köprüleyebilir, ancak tüm sınıfları bir Derleme'ye alabilir ve bu ad alanına ait olup olmadıklarını kontrol edebilirsiniz.

Assembly.GetTypes() yerel Meclis'te çalışır veya önce bir Meclis yükleyebilir, ardından onun üstünde GetTypes() öğesini arayabilirsiniz.

9
FlySwat

Sadece @aku answer gibi, ancak uzatma yöntemleri kullanarak:

string @namespace = "...";

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

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

Tüm sınıfları, Namespace adının bir satırına bölünerek alın:

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

İsim alanları aslında çalışma zamanının tasarımında oldukça pasif ve öncelikle kurumsal araçlar olarak hizmet ediyor. .NET türündeki Tam Adı, Namespace ve Class/Enum/Etc'den oluşur. Kombine. Yalnızca belirli bir Montajdan geçmek isterseniz, sadece Assembly tarafından döndürülen türler arasında dolaşmanız gerekir . GetExportedTypes () türünün değerini kontrol eder . Namespace . Geçerli AppDomain'de yüklenen tüm derlemeleri geçmeye çalışıyorsanız, AppDomain.CurrentDomain . GetAssemblies () komutunu kullanmak gerekir.

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

Oldukça basit

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