プロパティにプロパティを渡して、そのプロパティの値とプロパティの名前の両方を知るようにしたい。これはプロパティ名に一致するエラーを返すためです。第二パラメータは第一パラメータのラムダ内部プロパティの名前であるので、繰り返しC#リフレクションのないパラメータからプロパティ名を渡す/取得する
var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName));
何度:
は、私は現在、このようなコードを持っています。
ので、このパラメータを自動化することが可能です:重複したコードがなくなって
- プロパティの文字列名は、コンパイル時に計算され
- 、実行時ではなく、すべてのコール
var userNameField = personField.GetChildField(f => f.UserName);
私が持っている:
は、理想的には私は単純に見えるように私のコードをしたいと思いますExpression<Func...
、つまり((MemberExpression) getPropertyFunc.Body).Member.Name;
を使用してリフレクションを使用していますが、これは遅すぎます。特に、プロパティ値を取得するために使用できる関数に式をコンパイルします。
同様に、私はここにアイデアを読んでいる:Get name of property as a string
は、コンパイル時にGetChildField
関数からプロパティ名を移入する方法はありますか?何とかそれをモデルにエンコーディングしますか?ロザリンのマニュアルによれば
表現をコンパイルすることは遅すぎる場合、あなたはそのコンパイルの結果をキャッシュしようとしましたか?最初の呼び出しを速くすることはできませんが、それ以降の呼び出しは有効です。また、 'x => x.Property'という形式の式だけを受け入れるように見えるので、式をコンパイルするのではなく、リフレクションを通してプロパティを取得しようとしましたか? –
コンパイル結果をキャッシュすることはできますか?私はコードベース全体で多くの異なる式で式をコンパイルするメソッドを呼び出すので、呼び出しごとにキャッシュする必要があります。あなたの2番目の点は正しいです。私は、コンパイルを削除し、リフレクションを通してプロパティを取得することによってパフォーマンスを向上させることができましたが、プロパティ名が実行時にまだ計算されているので理想的ではありません。 –