C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#で現在の型(Type)のメンバーを取得する方法

C#では、System.Reflection 名前空間を利用することで、現在の型(Type)が持つメンバー(メソッド、フィールド、コンストラクターなど)を動的に取得できます。本記事では、GetMembers() メソッドや GetField() メソッドを使って、型のメンバー情報を取得する方法を具体的なコード例とともに解説します。

例1:GetMembers() ですべてのメンバーを取得する

まずは、基本的な使い方から見ていきましょう。Type.GetMembers() メソッドを呼び出すことで、その型に定義されているすべてのパブリックメンバーを MemberInfo 配列として取得できます。

using System;
using System.Reflection;
public class Demo {
    public static void Main() {
        Type type = typeof(Subject);
        try {
            FieldInfo fieldInfo = type.GetField("SubName");
            MemberInfo[] info = type.GetMembers();
            Console.Write("Members = ");
            for (int i = 0; i < info.Length; i++)
                Console.WriteLine(" {0}", info[i]);
            Console.WriteLine("FieldInfo = {0}", fieldInfo);
        }
        catch (ArgumentNullException e) {
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}
public class Subject {
    public string SubName = "Science";
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

Members =  System.String ToString()
 Boolean Equals(System.Object)
 Int32 GetHashCode()
 System.Type GetType()
 Void .ctor()
 System.String SubName
FieldInfo = System.String SubName

この出力からわかるように、ToString()Equals()GetHashCode() など、すべてのオブジェクトが継承しているメソッドも含めて取得されています。また、Subject クラスで定義したフィールド SubName も一覧に含まれています。

例2:BindingFlags を指定してメンバーを絞り込む

続いて、BindingFlags を組み合わせて、取得対象のメンバーを絞り込む方法を見てみましょう。ここでは「パブリックかつインスタンスメンバー」のみを取得しています。

using System;
using System.Reflection;
public class Demo {
    public static void Main() {
        Type type = typeof(Subject);
        try {
            FieldInfo fieldInfo = type.GetField("SubName");
            MemberInfo[] info = type.GetMembers(BindingFlags.Public | BindingFlags.Instance);
            Console.Write("Members = ");
            for (int i = 0; i < info.Length; i++)
                Console.WriteLine(" {0}", info[i]);
            Console.WriteLine("FieldInfo = {0}", fieldInfo);
        }
        catch (ArgumentNullException e) {
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}
public class Subject {
    public string SubName = "Science";
}

実行結果

Members =  System.String ToString()
 Boolean Equals(System.Object)
 Int32 GetHashCode()
 System.Type GetType()
 Void .ctor()
 System.String SubName
FieldInfo = System.String SubName

ポイントまとめ

  • Type.GetMembers():型が持つすべてのパブリックメンバーを MemberInfo[] として返します。
  • Type.GetField(名前):指定した名前のフィールド情報を FieldInfo として取得します。
  • BindingFlags.Public | BindingFlags.Instance のようにフラグを組み合わせることで、静的メンバーや非公開メンバーなど、取得範囲を柔軟に制御できます。
  • フィールド名に null を渡すと ArgumentNullException がスローされるため、実務では例外処理を入れておくのが安全です。

リフレクションを活用すれば、プラグイン機構の実装やシリアライザーの作成など、実行時に型の構造を調べて動的に処理を行うアプリケーションを構築できます。ぜひ実際のコードで試してみてください。

  1. C#で現在のインスタンスの型を取得する方法(GetTypeメソッド)

    C#でオブジェクトの現在のインスタンスの型(実行時の型)を取得するには、GetType()メソッドを使用します。このメソッドはすべての型の基底クラスであるSystem.Objectに定義されており、呼び出し元インスタンスの正確な型をSystem.Typeオブジェクトとして返します。 GetType()メソッドの基本 GetType()はインスタンスに対して呼び出すことで、その実行時の型情報を取得できます。戻り値であるTypeオブジェクトをそのまま文字列連結して出力すると、「System.String」や「System.Int32」のような完全修飾型名が表示されます。 例1:string型のイン

  2. C#で列挙型(Enum)の型を取得する方法

    C#で列挙型(Enum)の型情報を取得するには、GetType()メソッドを使用します。この記事では、実際のコード例を通じて、列挙型の型名や基になる型(Underlying Type)の取得方法をわかりやすく解説します。 列挙型の準備 まず、複数の列挙型の値を格納した配列を用意します。ここでは、.NET標準ライブラリに含まれる ConsoleColor と DayOfWeek の2つの列挙型を使用します。 Enum[] values = { ConsoleColor.Blue, DayOfWeek.Sunday}; GetType()メソッドで型を取得する 列挙値の型を取得するには、各値