1. ホーム
  2. c#

プロパティセレクタExpression<Func<T>>。選択したプロパティに値を取得/設定する方法

2023-09-16 02:30:19

質問

このように構成したいオブジェクトがあります。

var foo = new FancyObject(customer, c=>c.Email); //customer has Email property

第2パラメータはどのように宣言すればよいのでしょうか?

選択されたプロパティのセッター/ゲッターにアクセスするコードはどのように見えますか?

アップしました。モデル内にはEmailプロパティを持つエンティティがいくつかあります。そのため、おそらく以下のような署名になるでしょう。

public FancyObject(Entity holder, Expression<Func<T>> selector)

とコンストラクタの呼び出し

var foo = new FancyObject(customer, ()=>customer.Email);

どのように解決するのですか?

パラメータは Expression<Func<Customer,string>> selector . これを読み取るには、フラットコンパイルが必要です。

 Func<Customer,string> func = selector.Compile();

にアクセスすると func(customer) . 単純なセレクタの場合は、単純に分解することができます。

var prop = (PropertyInfo)((MemberExpression)selector.Body).Member;
prop.SetValue(customer, newValue, null);

しかし、より複雑な式は、手動でツリーを歩くか、4.0の式のノードタイプのいくつかを必要とします。

        Expression<Func<Customer, string>> email
             = cust => cust.Email;

        var newValue = Expression.Parameter(email.Body.Type);
        var assign = Expression.Lambda<Action<Customer, string>>(
            Expression.Assign(email.Body, newValue),
            email.Parameters[0], newValue);

        var getter = email.Compile();
        var setter = assign.Compile();