C#で式ツリー(x => x.プロパティ形式)からプロパティやフィールド、メソッド情報を取得する方法

ラムダ式
この記事は約6分で読めます。
管理人
管理人

最近、式ツリーを使ってプロパティやフィールド、メソッドの情報を取得する方法をちょっと調べたんだけど、実際に使うと結構便利なんだよ。少し紹介しようか?

質問者
質問者

ええ、ぜひお願いします!式ツリーって少し難しそうに聞こえるんですが、どんな風に使うんですか?

管理人
管理人

そうだね、まず基本的なところから説明するね。今回は、動物クラス(Animal)を作って、名前や足の数をプロパティとして持たせたんだ。それに、フィールドとメソッドも追加してみたよ。

/// <summary>
/// 動物クラス。動物の名前と足の数、フィールド変数を保持し、名前を取得するメソッドを提供します。
/// </summary>
public class Animal
{
    /// <summary>
    /// 動物の名前を表すプロパティ。
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 動物の足の数を表すプロパティ。
    /// </summary>
    public int NumberOfLegs { get; set; }

    /// <summary>
    /// フィールド変数。
    /// </summary>
    public int _fieldVar = 1;

    /// <summary>
    /// コンストラクタで名前と足の数を設定します。
    /// </summary>
    /// <param name="name">動物の名前。</param>
    /// <param name="numberOfLegs">動物の足の数。</param>
    public Animal(string name, int numberOfLegs)
    {
        Name = name;
        NumberOfLegs = numberOfLegs;
    }

    /// <summary>
    /// 動物の名前を取得するメソッド。
    /// </summary>
    /// <returns>動物の名前。</returns>
    public string GetAnimalName() => this.Name;
}
質問者
質問者

ふむふむ。名前と足の数をプロパティとして持っていて、フィールド変数とメソッドもあるんですね。なるほど、基本はわかりました!

管理人
管理人

そう、まずこのクラスを使ってみるんだけど、ここからプロパティやフィールド、メソッドの情報を取得するコードを作ったんだ。実行ボタンを押すと、それぞれの情報がテキストボックスに表示されるようになっているよ。

using System;
using System.Reflection;
using System.Windows.Forms;

namespace ExpressionSample001
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// コンストラクタ。フォームを初期化します。
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 実行ボタンがクリックされたときに呼び出されるイベントハンドラー。
        /// 動物オブジェクトのプロパティやフィールド、メソッド情報を取得し、テキストボックスに表示します。
        /// </summary>
        /// <param name="sender">イベントの発生元オブジェクト。</param>
        /// <param name="e">イベント引数。</param>
        private void BtnExecute_Click(object sender, EventArgs e)
        {
            // 動物のインスタンスを作成(犬、4本足)
            var dog = new Animal("犬", 4);

            // GetName メソッドを使って動物の名前を取得し、textBox1 に表示
            string name = dog.GetName(x => x.Name);
            this.textBox1.Text = name;

            // GetMemberInfo メソッドを使って _fieldVar のメンバー情報を取得し、textBox2 に表示
            MemberInfo mi1 = ObjectExtensions.GetMemberInfo<Animal>(x => x._fieldVar);
            this.textBox2.Text = mi1.Name;

            // GetMemberInfo メソッドを使って GetAnimalName メソッドのメンバー情報を取得し、textBox3 に表示
            MemberInfo mi2 = ObjectExtensions.GetMemberInfo<Animal>(x => x.GetAnimalName());
            this.textBox3.Text = mi2.Name;

            // GetPropertyInfo メソッドを使って Name プロパティの情報を取得し、textBox4 に表示
            PropertyInfo pi = ObjectExtensions.GetPropertyInfo<Animal>(x => x.Name);
            this.textBox4.Text = pi.Name;
        }
    }
}
質問者
質問者

プロパティやフィールド、そしてメソッドの名前まで、式ツリーを使って簡単に取得できるんですね!すごく便利ですね。

管理人
管理人

そうだね。これを使えば、コードの中で動的にプロパティやメソッドの情報を取得するのが簡単になるよ。実際のシステムで使うときにも役立つ場面が多いはず。

質問者
質問者

なるほど。確かに動的にプロパティを操作したりする場面ではとても役に立ちそうですね。もう少し勉強してみます!

管理人
管理人

ぜひぜひ。まずは今回のコードで慣れて、次にもっと複雑な式ツリーを扱えるようにしていくといいよ。いつでも質問してね。

質問者
質問者

ありがとうございます!次もよろしくお願いします!

管理人
管理人

最後にコード全文を載せておくので活用してね!

コメント

タイトルとURLをコピーしました