【问题标题】:Set Class object using List?使用列表设置类对象?
【发布时间】:2014-08-30 05:01:55
【问题描述】:

我有一个包含 n 个数据成员的类,如下所示:

public class Input
{
    int mode1  {get; set;}
    int geom2  {get; set;}
    int type3  {get; set;}
    int spacing4 {get; set;}
    int fluid5 {get; set;}
    int spec6 {get; set;}
    ...
    ...
    ...
    int data_n {get; set;}
} 

我有一个包含 n 个 int 项目的填充列表。

List<int> dataList = new List<int>

现在我想通过迭代或通过任何其他直接方法从 dataList 填充类 Input 的对象将有所帮助。谢谢

【问题讨论】:

  • 你的意思是var input = new Input { mode1 = dataList[i + 0], geom2 = dataList[i + 1], ...,其中i从0开始是数据列表中的输入索引,可以让你在一个循环中处理多个?你试过什么?
  • 是的@Nikhil 我希望列表填充单个实例。
  • 列表中的整数是否与Input 类中的字段顺序相同?
  • @CodeCaster,我的真实班级包含 98 个数据成员,所以我不能使用它。
  • @Rahul:98 个数据成员?

标签: c# list class loops


【解决方案1】:

你可以尝试这样的事情(对象初始化器):

Input input = new Input { mode1 = dataList[0], 
                          geom2 = dataList[1],  
                          type3 = dataList[2],
                          spacing4 = dataList[3],
                          fluid5 = dataList[4],
                          spec6 = dataList[5] };

【讨论】:

  • 您不需要括号来实例化new Input 对象吗?编辑:我假设你不这样做,因为 R.T 的回答已经提出了同样的建议。
  • @DeeMac 不,我们不需要括号。请看这里msdn.microsoft.com/en-us/library/bb384062.aspx。谢谢
  • @DeeMac 没问题,伙计。这当然不是一个愚蠢的评论。
【解决方案2】:

您可以像其他人所说的那样使用GetProperties 方法从反射中做到这一点,但为什么不使用一种简单的方法来做到这一点?

Input i = new Input();

i.mode1 = dataList[0];
i.geom2 = dataList[1];
i.type3 = dataList[2];
i.spacing4 = dataList[3];
i.fluid5 = dataList[4];
i.spec6 = dataList[5];

【讨论】:

    【解决方案3】:
      class Layout
       {
    int mode1 { get; set; }
    int geom2 { get; set; }
    int type3 { get; set; }
    int spacing4 { get; set; }
    int fluid5 { get; set; }
    int spec6 { get; set; }
    
    public int this[int number]
    {
    
        get
        {
            if (number == 1)
                return mode1;
            else if (number == 2)
                return geom2;
            else if (number == 3)
                return type3;
            else if (number == 4)
                return spacing4;
            else if (number == 5)
                return fluid5;
            else if (number == 6)
                return spec6;
            else
                return -1;
        }
        set
        {
            if (number == 1)
                mode1 = value;
            else if (number == 2)
                geom2 = value;
            else if (number == 3)
                type3 = value;
            else if (number == 4)
                spacing4 = value;
            else if (number == 5)
                fluid5 = value;
            else if (number == 6)
                spec6 = value;
        }
    }
    

    迭代代码

     Layout layout = new Layout();
    foreach(int i in dataList)
     {
       layout[i]=dataList[i];
     }
    

    【讨论】:

      【解决方案4】:

      反射在这里很有用,但如果您在一个类中有 98 个属性,则绝对应该重新考虑您的设计。

      var properties = typeof(Input)
                      .GetProperties()
                      .Where(p => p.PropertyType == typeof(int));
      
      int i = 0;
      foreach(var prop in properties)
          prop.SetValue(yourObject, dataList[i++]);
      

      但这并不能保证每个属性都会被正确分配,因为正如@CodeCaster GetProperty 方法已经提到的那样,它不会按特定顺序返回属性。并且无法确定顺序并将值映射到有List<int>时的属性,如果可以改用Dictionary<string, int>,其中key是属性名,则可以将每个属性设置为对应的值。

      【讨论】:

      【解决方案5】:

      您可以使用反射尝试这样的事情:

      var properties = typeof(Input).GetProperties();
      
      for(int i = 0; i < properties.Count(); ++i)
      {
          properties[i].SetValue(dataList[i]);
      }
      

      【讨论】:

        【解决方案6】:

        我不确定你是如何使用你的属性的,但你也可以在你的班级中有一个列表,然后设置整个列表或添加到该列表中。然后您可以使用枚举来跟踪值。

        类似这样的:

        public class Input
        {
            public enum MyValues
            {
                mode1 = 1,
                geom2 = 2,
                ...
            }
            public List<int> Data { get; set; }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-17
          • 2012-01-31
          相关资源
          最近更新 更多