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

C# 动态链接,更改列表中每个项目的属性,c#,linq,lambda,C#,Linq,Lambda,动态地,我想获取一个字符串属性,比如“GPARank”,并更改它的值 通常,我会 var rank = gpa.ForEach(x => x.GPARank = i); 但在本例中,我不知道在编译时更改了哪个属性。我试图修改Marc Gravell的代码以供我使用,但我的大脑爆炸了 谢谢 使用反射解决,仍然需要动态linq表达式解决方案 gpa.ForEach(x => x.GetType().GetProperty(_ColumnRank).SetValue(x, i += 1

动态地,我想获取一个字符串属性,比如“GPARank”,并更改它的值

通常,我会

var rank = gpa.ForEach(x => x.GPARank = i);
但在本例中,我不知道在编译时更改了哪个属性。我试图修改Marc Gravell的代码以供我使用,但我的大脑爆炸了

谢谢

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

gpa.ForEach(x => x.GetType().GetProperty(_ColumnRank).SetValue(x, i += 1 , null));
我能够利用反射来解决这个问题。但是,如果有人有时间或希望向我展示如何使用动态linq和运行时表达式来实现这一点,我真的很想知道如何做到这一点。

伪代码,未经测试:

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);
string propName=“GPARank”;
PropertyInfo prop=typeof(Item).GetProperty(propName);
动作设置器=(动作)委托.CreateDelegate(
typeof(Action),prop.GetSetMethod());
foreach(列表中的项目obj)setter(obj,newValue);
不过老实说,在大多数情况下,直接使用PropertyInfo(通过SetValue)就可以了;在这种情况下,我对您的原始代码所做的唯一更改是将获取PropertyInfo移到循环之外,而不是每个项。

伪代码,未经测试:

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);
string propName=“GPARank”;
PropertyInfo prop=typeof(Item).GetProperty(propName);
动作设置器=(动作)委托.CreateDelegate(
typeof(Action),prop.GetSetMethod());
foreach(列表中的项目obj)setter(obj,newValue);

不过老实说,在大多数情况下,直接使用PropertyInfo(通过SetValue)就可以了;在这种情况下,我对您的原始代码所做的唯一更改是在循环之外获取PropertyInfo,而不是每个项。

为什么您“不知道在编译时更改的是哪个属性”?我有一个类,它有20多个排序属性,用户进行筛选并重新排序,我想用linq来做这件事,而不是点击数据库。我对键盘上的脑溅不承担任何责任。其次,LINQ主要是查询,而不是变异。在4.0中,表达式确实允许赋值,但简单的委托要容易得多。我现在不在电脑旁,但如果您愿意,我可以明天添加一个代理版本。我不确定表达式版本是否值得,因为AFAIK没有提供程序会使用它,所以它最终只不过是一种复杂的委托方式。@MarcGravel是的,出于教育目的,我想看看这段代码。Thanks@bladefist哪个?前几天晚上,我添加了一个代理版本(未测试)…为什么你“不知道你在编译时更改了哪个属性”?我有一个类,有20多个排序属性,当用户过滤并重新排序时,我希望使用linq来完成此操作,而不是访问数据库。我对键盘上的脑溅不承担任何责任。其次,LINQ主要是查询,而不是变异。在4.0中,表达式确实允许赋值,但简单的委托要容易得多。我现在不在电脑旁,但如果您愿意,我可以明天添加一个代理版本。我不确定表达式版本是否值得,因为AFAIK没有提供程序会使用它,所以它最终只不过是一种复杂的委托方式。@MarcGravel是的,出于教育目的,我想看看这段代码。Thanks@bladefist哪个?前几天晚上我添加了一个代理版本(未经测试)…感谢您的回复。这东西很有趣。谢谢你的回复。这东西很有趣。