我有一个对象列表,其中大多数属性的区别仅在于增加数量。
名称 姓 Week1 Week2 译员更加 Week4 Week5 Week6 等等。
我希望能够在表格中显示他们的价值,但仅限于选定的金额...让我们说只显示前4周。
因此,我必须为每个星期做出声明。我试图遍历这个对象,但据我所知,我不能增加属性的名称。有没有办法循环对象,无论名称以%%....开头还是递增周数?
我返回的"最终对象列表"它结合了两个列表。
List<WeekViewModel> results = new List<WeekViewModel>();
results.AddRange(ReportData.Select(x =>
new WeekViewModel()
{
full_name = x.full_name,
location = x.location,
...
week1 = Category.Where(c => c.Color_code == x.week1).FirstOrDefault(),
week2 = Category.Where(c => c.Color_code == x.week2).FirstOrDefault(),
week3 = Category.Where(c => c.Color_code == x.week3).FirstOrDefault(),
}));
每个星期都是自定义类别类别,其中包含很少的道具
public class Category
{
public string Short_name { get; set; }
public int Color_code { get; set; }
}
}
我基本上只需要每周的短名称。不确定如何在这里使用C.Evenhuis的建议......有人可以请告诉我如何在这里使用反射?我不熟悉这个概念
答案 0 :(得分:1)
我认为Week
中的所有myObject
属性都具有相同的数据类型,为简单起见,我在这里使用了string
:
您可以预先填充Dictionary<int, Func<string>>
:
Dictionary<int, Func<myObject, string>> weekMapping = new Dictionary<int, Func<myObject, string>>();
weekMapping[1] = (o) => o.Week1;
weekMapping[2] = (o) => o.Week2;
然后永远myObject
你有:
myObject o = ...;
for (int week = 1; week <= 2; week++)
{
string weekValue = weekMapping[week](o);
}
您也可以选择使用反射,因为您可以按名称访问属性,但它通常会使代码更复杂,更不易读。
答案 1 :(得分:0)
我决定在我的视野中使用反射,效果很好。
@for (var i = 1; i < Model.numberOfWeeksx; i++)
{
var xx = data.GetType().GetProperty("week" + i).GetValue(data, null);
var yy = xx.GetType().GetProperty("Short_name").GetValue(xx, null);
<td>@yy</td>
}
答案 2 :(得分:-1)
我认为您必须使用反射提取属性名称并找到匹配的属性名称并自行排序。 创建一个方法,查找名称与(正则表达式)模式匹配的类型的公共实例属性。 请记住,如果您进行字母排序,第10周将在第2周之前进行。 将数字部分解析为int并按其排序。