如何动态循环遍历 MVC 数据模型中的字段名称?

How to dynamically loop through field names in an MVC Data Model?

在我的数据库结构中,我有一个特定用户的字段数组。喜欢...

User: Choice1, Choice2, Choice3, Choice4, etc.

当视图发布到控制器时,将进入这些字段的值从一组动态构造的隐藏输入传递到字符串数组 (MyChoices[]) 中。

我的绝妙想法是使用 for 循环遍历数组并赋值。所以,像这样:

for (int x = 0; x < MyChoices.Count(); x++ {
  model.Choice[x + 1] = MyChoices[x];
}

但是,我没有运气弄清楚如何动态地从模型中获取字段名称以便我可以分配它们。

基本上我在寻找类似的东西:model.GetField("Choice" + x + 1)

有什么办法吗?我正在考虑改革我的数据结构,这样我就没有列出 Choice1、Choice2、Choice3 等,而是有一个 Choices table,其中列出了 User、ChoiceID、ChoiceValue。但是,我真的不想重组我的数据,因为我有另一个页面,它实际上被放置在 table 中。有没有办法做到这一点,或者我只是违反了所有 Database/Developer 戒律?

我知道这是一个相当 "How do you do this" 类型的问题,但我一直在搜索并没有真正找到解决方案......我实际上正在寻找 C# 语法,所以我认为它符合条件。

这是模型 class:

public partial class UserChoice
{
    public int UserChoiceID { get; set; }
    public Nullable<int> UserID { get; set; }
    public string User { get; set; }
    public string Choice1 { get; set; }
    public string Choice2 { get; set; }
    public string Choice3 { get; set; }
    public string Choice4 { get; set; }
    public string Choice5 { get; set; }
    public string Choice6 { get; set; }
    public string Choice7 { get; set; }
    public string Choice8 { get; set; }
    public string Choice9 { get; set; }
    public string Choice10 { get; set; }
    public string Choice11 { get; set; }
    public string Choice12 { get; set; }
    public string Choice13 { get; set; }
    public string Choice14 { get; set; }
    public string Choice15 { get; set; }
    public string Choice16 { get; set; }
}

如果您不知道即将出现的字段或属性,您应该使用反射

Documentation

样本:

            FieldInfo[] myField = myType.GetFields();

            for(int i = 0; i < myField.Length; i++)
            {                  
                    Console.WriteLine(myField[i].Name);
            }

如果你想动态地或在运行时获取属性名字,你应该使用System.Reflection,你甚至可以获取或设置它们的值

好吧,我是这样做的:

首先,向 Halford 致敬...我的意思是,@Thorarins,因为他几乎把我引向了正确的方向。基本上,我能够通过以下方式完成我的任务:

for (int x = 0; x < MyChoices.Count(); x++)
{
    td.GetType().GetProperties().Single(p => p.Name == "Choice" + (x + 1)).SetValue(td, MyChoices[x]);
}

我的最终解决方案看起来有点笨拙和不自然。所以,如果有人有任何好的想法如何让它变得更好,我会洗耳恭听。