プロパティセレクタ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();
関連
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] C#の{ get; set; }構文とは何ですか?
-
[解決済み] ラムダ式からプロパティ名を取得する
-
[解決済み】なぜFunc<T>ではなくExpression<Func<T>を使うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】Nullableオブジェクトは値を持たなければならない?