2011-10-30 62 views
1

動態地,我想採用像「GPARank」這樣的字符串屬性並更改它的值。動態鏈接,更改列表中的每個項目的屬性

通常,我會

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

但在這種情況下,我不知道我在編譯時改變其性質。我嘗試修改Marc Gravell的代碼Dynamic LINQ OrderBy on IEnumerable<T>供我使用,但我的大腦爆炸了。

謝謝!

使用反射想通了,還是要一個動態的LINQ表達式的解決方案

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

我能弄清楚如何做到這一點使用反射。但是,如果任何人有時間或願意告訴我如何使用動態LINQ與運行時表達式來做到這一點,我真的很想知道如何做到這一點。

+0

它是怎麼來的,你「不知道你在編譯時改變哪個屬性」? – GianT971

+0

我有一個擁有20多個排名屬性的類,當用戶過濾掉並重新排序時,我想用linq做這個,而不是打到數據庫。 – bladefist

+0

我不接受鍵盤上的大腦炸彈的責任。接下來,LINQ主要是查詢,而不是變異。在4.0中,表達式允許賦值,但簡單的委託會更容易。我現在不在PC上,但如果您願意,我可以在明天添加代表版本。我不確定Expression版本是否值得,因爲AFAIK沒有提供商會使用它,所以它最終只不過是一個棘手的方式來做一個委託。 –

回答

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); 

說實話,雖然,在剛剛使用的PropertyInfo直接(通過的SetValue)將工作大部分情況下;在這種情況下,我將對您的原始代碼做出的唯一更改就是移動獲取PropertyInfo 以外的循環,而不是按項目。

+0

感謝您的回覆。這東西很有趣。 – bladefist