2017-03-22 8 views
0

動的プロパティー名をとるlinq照会を作成しようとしています。したがって、たとえば、プロパティ名は「試験」、であれば、単純なクエリは次のようになります。動的プロパティー名

var test = testList.Select(x => x.test).Distinct().ToList(); 

しかし、私は例えば、動的にプロパティ名を生成したい:

var propertyName = "test"; 

var test = testList.Select(x => x.propertyName).Distinct().ToList(); 

私が手'propertyName'は実際のプロパティではないため、エラーです。

は何これを達成するための最良の方法だろうか?

+3

。 'testList'が' ExpandoObjects'(推奨されません)でいっぱいであれば、それらを 'IDictionary 'にキャストし、文字列でインデックスすることができます。また、リフレクションを使用することもできます。しかし、あなたが本当にこれを行う必要はほとんどありません。どのような問題を解決するために、このLINQクエリを使用していますか? –

+0

...ああ、プロパティ式ラムダを '式 'などで構築することもできます。私はそれがどのように推薦されているのか、おそらく他のものよりもよく分かりません。 –

+0

返事をありがとう、私はおそらくこれについては間違った方向に行くだろう。私はちょうどこれと同様のプロパティの一意の値のリストを抽出しようとしています - http://stackoverflow.com/questions/10255121/get-a-list-of-distinct-values-in-list があります私がこれを行うために必要ないくつかのプロパティとクラス。私はコードを複製する必要がないように、プロパティ名を動的に生成したいと思っていました。 – richard

答えて

4

あなたが何をしようとして行うためにリフレクションを使用する必要があると思います:あなたはそれを行うことはできません

var test = testList 
       .Select(x => x.GetType().GetProperty(propertyName).GetValue(x)) 
       .Distinct() 
       .ToList(); 
+3

もちろん、これですべての型チェックを失うので、厄介なエラーが発生しやすくなります。 – DavidG

+0

また、これは同じものではなく、 'object'の列挙を返しますが、元のコードは型固有です。 – DavidG

+0

@DavidGそれは良い点です。あなたがこの式を使用するすべてのプロパティの戻り値の型を知っていれば、 '.Distinct()'の前に '.Cast ()'を追加するか、オブジェクト 'GetValue() 'が返ってくる。提案された@EdPlunkettのような式を構築することはおそらく型安全です。 – itsme86