297

C# でリフレクションを使用して名前空間内のすべてのクラスを取得するにはどうすればよいですか?

4

11 に答える 11

335

namespace次のコードは、現在のアセンブリで定義されている指定されたクラスの名前を出力します。
他の人が指摘したように、名前空間は異なるモジュール間で分散している可能性があるため、最初にアセンブリのリストを取得する必要があります。

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));
于 2008-09-17T03:43:01.660 に答える
33
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;
}

注意: 上記のコードは何が起こっているかを示しています。それを実装する場合は、簡略化されたバージョンを使用できます。

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);
}
于 2008-09-17T03:38:33.700 に答える
25

特定のアセンブリ、NameSpace、および 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();

注: プロジェクトはアセンブリを参照する必要があります

于 2016-01-19T05:28:15.253 に答える
14

型の 1 つが別のアセンブリの型をサブクラス化する場合に発生する可能性が高い LoaderException エラーの修正を次に示します。

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

これは、他のアセンブリで定義された型の読み込みに役立つはずです。

それが役立つことを願っています!

于 2008-09-17T03:52:04.713 に答える
10

名前空間は複数のアセンブリをブリッジできるため、名前空間内のすべての型を取得することはできませんが、アセンブリ内のすべてのクラスを取得して、それらがその名前空間に属しているかどうかを確認できます。

Assembly.GetTypes()ローカル アセンブリで動作するか、最初にアセンブリを読み込んでから呼び出すことができますGetTypes()

于 2008-09-17T03:39:58.003 に答える
6

@aku answer と同じですが、拡張メソッドを使用します。

string @namespace = "...";

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

types.ForEach(t => Console.WriteLine(t.Name));
于 2013-01-09T11:37:57.110 に答える
5

名前空間名の一部ですべてのクラスを 1 行で取得します。

var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
于 2014-12-22T08:10:01.453 に答える
3

名前空間は、実際にはランタイムの設計においてかなり受動的であり、主に組織ツールとして機能します。.NET の型の完全な名前は、名前空間と Class/Enum/Etc で構成されます。組み合わせた。特定のアセンブリだけを調べたい場合は、アセンブリによって返された型を単純にループします。タイプの値をチェックするGetExportedTypes() 。名前空間。現在の AppDomain に読み込まれているすべてのアセンブリを調べようとしている場合は、AppDomain.CurrentDomain を使用する必要があります。GetAssemblies()

于 2008-09-17T03:51:15.200 に答える
2
//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 
于 2009-04-18T05:43:19.533 に答える