动态地,我想采用像“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和运行时表达式来做这件事,我真的很想知道如何做到这一点。
答案 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 外部循环,而不是每个项目。