晴耕雨読

working in the fields on fine days and reading books on rainy days

[C#] Reflectionでプロパティ値を動的に取得する

C# のメタプログラミング (Reflection) で、インスタンスのプロパティ値を動的に取得するには、Type#GetProperty メソッドを使用します。 プロパティ値を動的に取得する方法は以下の通りです。

  1. 調査対象のインスタンスを用意する。
  2. インスタンスのクラスを Type#GetType で Type 型を取得する。
    • クラスから型を取得したいときは Type t = typeof(MyPropertyClass);
    • インスタンスから型を取得したいときは Type t = new MyPropertyClass().GetType();
    • 文字列から型を取得したいときは Type t = Type.GetType("System.String", true);
  3. Type#GetProperty メソッドの引数にプロパティ名の文字列を渡して実行する。
  4. 取得できないときは null、取得できたときは PropertyInfo 型が返り値として得られる。
  5. PropertyInfo#GetValue メソッドの引数にインスタンスを渡すことで、そのインスタンスにあるプロパティの値を取得することができる。
using System.Reflection;

// 検証用クラス
public class MyPropertyClass
{
    public int Property1 { get; set; }
    public string? Property2 { get; set; }
}

public class ExampleGetProperties
{
    public static void Main()
    {
        var myprop = new MyPropertyClass() {
            Property1 = 123,
            Property2 = "hello"
        };

        Type t = myprop.GetType();

        PropertyInfo? propInfo1 = t.GetProperty("Property1");  // プロパティ情報の取得
        Console.WriteLine($"プロパティ名: {propInfo1?.Name}");
        Console.WriteLine($"プロパティ型: {propInfo1?.PropertyType}");
        Console.WriteLine($"プロパティ値: {propInfo1?.GetValue(myprop)}");  // プロパティ値の取得
        Console.WriteLine();

        PropertyInfo? propInfo2 = t.GetProperty("Property2");  // プロパティ情報の取得
        Console.WriteLine($"プロパティ名: {propInfo2?.Name}");
        Console.WriteLine($"プロパティ型: {propInfo2?.PropertyType}");
        Console.WriteLine($"プロパティ値: {propInfo2?.GetValue(myprop)}");  // プロパティ値の取得
        Console.WriteLine();
    }
}

プログラムを実行すると以下の結果が出力されます。

プロパティ名: Property1
プロパティ型: System.Int32
プロパティ値: 123

プロパティ名: Property2
プロパティ型: System.String
プロパティ値: hello

以上です。