使用List设置Class对象

本文关键字:对象 Class 设置 List 使用 | 更新日期: 2023-09-27 18:12:10

我有一个包含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输入将是有帮助的。感谢

使用List设置Class对象

反射在这里可能很有用,但如果一个类中有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是属性名称,则可以将每个属性设置为相应的值。

您可以尝试这样的操作(对象初始值设定项(:

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

正如其他人所说,您可以使用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];

您可以使用反射来尝试类似的操作:

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

我不确定如何使用属性,但也可以在类中有一个列表,然后设置整个列表或添加到其中。然后可以使用枚举来跟踪这些值。

类似这样的东西:

public class Input
{
    public enum MyValues
    {
        mode1 = 1,
        geom2 = 2,
        ...
    }
    public List<int> Data { get; set; }
}
  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];
 }