我有一个List集合
比如List<clsTest> objList = new List<clsTest>();
它有大约一百列。
Predicate<ScreenDefinition> linqQuery = new Predicate<ScreenDefinition>(objQuery);
index = tmp.FindIndex(objQuery);
objQuery是对条件的查询
我尝试过更新
listJoinedScreenDefinition[index].fieldName = "update";
但问题是我需要根据我的逻辑动态生成'fieldName'。
Say "seat" + 05 => seat05 is the column name.
就像明智的 seat1 - 座位100 一样。
在每次迭代中,我只需要更新一列。
在我尝试如何在该List中传递动态列名的方式?
我是.Net和Linq的新手。
请提出一些实现此目的的方法..
答案 0 :(得分:4)
您的问题与列表和查询无关。如果您的clsTest
课程只有一个实例,那么情况会相同。问题在于班级的设计。
如果我理解正确,clsTest
有100名成员,其名称如seat1
,seat2
,seat50
等,是否正确?如果是这样,那是一个非常糟糕的类设计,正如你已经发现的那样,因为它要求你硬编码对代码中特定字段的所有引用,或者交替使用反射(正如Garath在他的回答中所建议的那样),这是更复杂的容易出错。
更好的解决方案是重新设计clsTest
课程,使其成为名为Seats
的{{1}}或Array
个席位。如果您有List
,则可以访问public List<string> Seats {get;set;}
以获得第五个席位。
当然,如果它不仅仅是一个座位列表,而且你可以有几种不同类型的编号属性(例如“座位”+“05”和“行”+“02”),你可以使用myObject.Seats[5]
,用于在“seat05”及其值之间进行映射。
答案 1 :(得分:0)
最简单的方法是使用反射。我不知道你是否在使用属性或字段。 对于属性代码将如下所示:
var target = listJoinedScreenDefinition[index];
Type type = target.GetType();
PropertyInfo prop = type.GetProperty("propertyName");
prop.SetValue (target, propertyValue, null);
对于字段代码非常相似:
var target = listJoinedScreenDefinition[index];
FieldInfo fi = target.GetType().GetField("Name", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(target ,value)