C#中如何通过字符串列表为对象属性赋值(解决索引越界)
解决方案:列表元素依次赋值给对象Mod1-Mod6属性
你的代码出现索引越界的核心原因是逻辑偏离需求:你用foreach遍历列表中的每个字符串元素,然后尝试取每个元素的第0到第5位字符(比如item[1]),但列表里的短字符串(如"1"、"0")长度仅为1,访问item[1]自然触发索引越界。而你的真实需求是列表的第N个元素对应对象的ModN属性,并非拆分每个元素的字符赋值。
以下是几种可行实现方案:
方案1:直接索引赋值(最直观)
如果能确保列表长度至少为6,直接按索引一一对应赋值即可:
var modifications = new List<string>() {"1", "10", "100", "101", "102", "0"}; obj.Mod1 = modifications[0]; obj.Mod2 = modifications[1]; obj.Mod3 = modifications[2]; obj.Mod4 = modifications[3]; obj.Mod5 = modifications[4]; obj.Mod6 = modifications[5];
方案2:兼容列表长度不足的情况
如果列表可能少于6个元素,添加判断避免索引越界,同时给属性设置默认值(比如空字符串):
var modifications = new List<string>() {"1", "10", "100", "101", "102", "0"}; obj.Mod1 = modifications.Count > 0 ? modifications[0] : string.Empty; obj.Mod2 = modifications.Count > 1 ? modifications[1] : string.Empty; obj.Mod3 = modifications.Count > 2 ? modifications[2] : string.Empty; obj.Mod4 = modifications.Count > 3 ? modifications[3] : string.Empty; obj.Mod5 = modifications.Count > 4 ? modifications[4] : string.Empty; obj.Mod6 = modifications.Count > 5 ? modifications[5] : string.Empty;
方案3:反射批量赋值(适合属性较多的场景)
如果后续属性数量可能增加(比如Mod1-Mod10),用反射减少重复代码:
var modifications = new List<string>() {"1", "10", "100", "101", "102", "0"}; var objType = obj.GetType(); for (int i = 0; i < 6; i++) { // 拼接属性名:Mod1、Mod2...Mod6 var propertyName = $"Mod{i + 1}"; var property = objType.GetProperty(propertyName); // 确保属性存在且列表对应位置有元素 if (property != null && modifications.Count > i) { property.SetValue(obj, modifications[i]); } }
内容的提问来源于stack exchange,提问作者varun
相关产品推荐
相关产品推荐

