动态链接,更改列表中每个项目的属性

时间:2011-10-30 21:44:29

标签: c# linq lambda

动态地,我想采用像“GPARank”这样的字符串属性并更改它的值。

通常,我会

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

但在这种情况下,我不知道在编译时我要更改哪个属性。为了我的用途,我试图在Dynamic LINQ OrderBy on IEnumerable<T>修改Marc Gravell的代码,但是我的大脑爆炸了。

谢谢!

想出使用反射,仍然需要动态linq表达式解决方案

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

我能够弄清楚如何使用反射来做到这一点。但是,如果有人有时间或愿意向我展示如何使用动态linq和运行时表达式来做这件事,我真的很想知道如何做到这一点。

1 个答案:

答案 0 :(得分: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 外部循环,而不是每个项目。