2011-10-30 22 views
1

動的に、「GPARank」のような文字列プロパティを取得してその値を変更したいと思います。動的リンク、リスト内のすべての項目のプロパティを変更する

通常、私は

var rank = gpa.ForEach(x => x.GPARank = i); 

を持っているでしょう。しかし、この場合、私はコンパイル時に変更していますどのプロパティか分かりません。私はDynamic LINQ OrderBy on IEnumerable<T>でMarc Gravellのコードを修正しようとしましたが、私の脳は爆発しました。

ありがとうございます!リフレクションを使用して考え出した

、まだ私はこの使用して反射を行う方法を見つけ出すことができました

gpa.ForEach(x => x.GetType().GetProperty(_ColumnRank).SetValue(x, i += 1 , null)); 

動的なLINQ式のソリューションを求めています。しかし、誰かが実行時式で動的なlinqを使ってこれを行う方法を私に教えたい時や希望があるなら、これをどうやって行うのが本当に好きです。

+0

「コンパイル時にどのプロパティを変更しているのかわからない」とはどういうことでしょうか? – GianT971

+0

私は20以上のランキングのプロパティを持つクラスを持っています。ユーザーがフィルタを外して再注文すると、私はlinqを使ってこれを行い、データベースにヒットしません。 – bladefist

+0

私はキーボードの脳の怪我に対して一切責任を負いません。次に、LINQは主にクエリであり、突然変異ではありません。 4.0では、Expressionでは代入が可能ですが、単純なデリゲートがはるかに簡単です。私は今はPCにいませんが、明日ご希望の場合は代理人バージョンを追加できます。 AFAIKではプロバイダーが使用されないため、Expressionバージョンは価値があるとは思えません。だから、最終的にデリゲートを作るのは難しいことです。 –

答えて

1

擬似コード、テストされていない:

string propName = "GPARank"; 
PropertyInfo prop = typeof(Item).GetProperty(propName); 
Action<Item,string> setter = (Action<Item,string>)Delegate.CreateDelegate(
    typeof(Action<Item,string>), prop.GetSetMethod()); 
foreach(Item obj in list) setter(obj,newValue); 

だけ(SetValueを経由して)直接PropertyInfoを使用して、ほとんどの場合、しかし正直に動作します。その場合、元のコードに行う唯一の変更は、項目ごとではなく、外のPropertyInfo を移動することになります。

+0

お返事ありがとうございます。このことはとても面白いです。 – bladefist

関連する問題