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

C#のType.GetMembers()メソッドとは?構文とサンプルコードで解説

C#のType.GetMembers()メソッドは、現在のTypeが持つメンバー(プロパティ、メソッド、フィールド、イベントなど)をすべて取得するためのメソッドです。リフレクションを利用して、型の内部構造を実行時に調べたい場合に活用できます。

構文

Type.GetMembers()メソッドの構文は以下のとおりです。

public System.Reflection.MemberInfo[] GetMembers ();
public abstract System.Reflection.MemberInfo[] GetMembers (System.Reflection.BindingFlags bindingAttr);

引数なしで呼び出した場合はパブリックなメンバーのみが返され、BindingFlagsを指定することで、取得対象のメンバーを細かく制御できます。

使用例1:引数なしでGetMembers()を呼び出す

まずは、引数を指定せずにType.GetMembers()メソッドを使用する基本的な例を見てみましょう。

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

このように、Subjectクラス自体が持つ「SubName」フィールドに加えて、すべてのクラスが暗黙的に継承しているToString()、Equals()、GetHashCode()、GetType()などのメンバーも一緒に取得されていることがわかります。

使用例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()

まとめ

Type.GetMembers()メソッドを使うことで、指定した型のメンバー情報をMemberInfo配列として簡単に取得できます。BindingFlagsを組み合わせれば、「パブリックのみ」「インスタンスメンバーのみ」など、目的に応じた柔軟な検索が可能です。リフレクションによる動的な型操作や、プラグイン機構の実装など、さまざまな場面で役立つメソッドなので、ぜひ覚えておきましょう。

  1. C#のType.Equals()メソッドとは?使い方とサンプルコードを解説

    C#のType.Equals()メソッドは、現在のTypeインスタンスが表す基盤となるシステム型が、指定されたObjectまたはTypeの基盤となるシステム型と同一であるかどうかを判定します。リフレクション処理などで型同士を比較したい場合に役立つメソッドです。 構文 public virtual bool Equals (Type o); public override bool Equals (object o); パラメータ o:現在のTypeの基盤となるシステム型と比較する対象となるオブジェクトまたは型を指定します。 戻り値 両方の基盤システム型が同じ場合は true、異なる場合は fa

  2. C#のElementAt()メソッドの使い方をわかりやすく解説

    ElementAt()は、C#のSystem.Linq名前空間に含まれる拡張メソッドの一つで、配列やリストなどのシーケンスから、指定したインデックス位置にある要素を取得・表示するために使用します。 基本的な使い方 まず、次のような文字列配列を用意します。 string[] arr = { One, Two, Three, Four, Five }; この配列からインデックス0の要素を取得したい場合は、ElementAt()メソッドにインデックス番号を引数として渡します。 arr.ElementAt(0); サンプルコード 以下は、ElementAt()メソッドを使って特定のインデックスの要素を