2017-07-29 12 views
1

プロパティにプロパティを渡して、そのプロパティの値とプロパティの名前の両方を知るようにしたい。これはプロパティ名に一致するエラーを返すためです。第二パラメータは第一パラメータのラムダ内部プロパティの名前であるので、繰り返しC#リフレクションのないパラメータからプロパティ名を渡す/取得する

var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName)); 

何度:

は、私は現在、このようなコードを持っています。

ので、このパラメータを自動化することが可能です:重複したコードがなくなって

  1. プロパティの文字列名は、コンパイル時に計算され
  2. 、実行時ではなく、すべてのコール
のために

var userNameField = personField.GetChildField(f => f.UserName); 

私が持っている:

は、理想的には私は単純に見えるように私のコードをしたいと思いますExpression<Func...、つまり((MemberExpression) getPropertyFunc.Body).Member.Name;を使用してリフレクションを使用していますが、これは遅すぎます。特に、プロパティ値を取得するために使用できる関数に式をコンパイルします。

同様に、私はここにアイデアを読んでいる:Get name of property as a string

は、コンパイル時にGetChildField関数からプロパティ名を移入する方法はありますか?何とかそれをモデルにエンコーディングしますか?ロザリンのマニュアルによれば

+0

表現をコンパイルすることは遅すぎる場合、あなたはそのコンパイルの結果をキャッシュしようとしましたか?最初の呼び出しを速くすることはできませんが、それ以降の呼び出しは有効です。また、 'x => x.Property'という形式の式だけを受け入れるように見えるので、式をコンパイルするのではなく、リフレクションを通してプロパティを取得しようとしましたか? –

+0

コンパイル結果をキャッシュすることはできますか?私はコードベース全体で多くの異なる式で式をコンパイルするメソッドを呼び出すので、呼び出しごとにキャッシュする必要があります。あなたの2番目の点は正しいです。私は、コンパイルを削除し、リフレクションを通してプロパティを取得することによってパフォーマンスを向上させることができましたが、プロパティ名が実行時にまだ計算されているので理想的ではありません。 –

答えて

-1

herenameofオペレータがコンパイル時

がNameOf発現が一定であるを読み取る「セマンティクス」セクションの最初の行当たりで評価で見出さ。どの場合も、nameof(...)はコンパイル時に評価され、文字列を生成します。その引数は実行時には評価されず、到達不能なコードとみなされます(しかし、 "到達不能なコード"という警告は出ません)。

0

これは、次によって可能です:

Item model=new Item();  
var propertyInfo = model.GetType();  
var value=propertyInfo.GetProperty("IrrA").GetValue(model, null).ToString(); 
+0

OPはリフレクションソリューションを要求していませんでしたか? – kuskmen

+0

@kuskmen実際には、OPは反射防止ソリューションを求めていませんでした。 OPは、式のコンパイルが遅すぎると述べていました。これは、式をコンパイルするより速いかもしれません(または、私はテストしませんでした)。 –

+0

実行時ではなく、コンパイル時にプロパティ名を計算するソリューションを求めました。ただし、このソリューションは式をコンパイルするよりも高速です。 –

関連する問題