循环遍历名称上具有不同编号的对象变量

时间:2015-11-30 08:37:15

标签: c# asp.net for-loop

我有以下课程:

public class Employees {
public string field1 { get; set; }
public string field2 { get; set; }
public string field3 { get; set; }
public string field4 { get; set; }
}

我希望将值更改为所有成员。 所以我可以这样:

Employees.field1 = "ghgf";
Employees.field2 = "ghgf";
Employees.field3 = "ghgf";
Employees.field4 = "ghgf";
但是它非常难看。会员数量为30,所以这不是一个好方法...... 我想使用for循环,遍历所有成员并动态获取相关字段并更改值。例如:

for(int i=1; i<4; i++) {
var field = "field" + i;
Employees.field(the Var!!) = "fgdfd";
}

但在这一行:

Employees.field(the Var!!) = "fgdfd";

我遇到了问题,因为field是for循环中定义的var。

5 个答案:

答案 0 :(得分:3)

你可以使用反射以硬(而不是正确的,IMO)的方式做到这一点。 但如果您有30个这样的变量,请更改您的方法:使用List<string>Dictionary <whateverKey, string>来存储您的所有字段

答案 1 :(得分:1)

如果你真的必须使用反射,你可以这样做:

var employees = new Employees();
var type = employees.GetType();

for (int i = 1; i <= 4; ++i)
    type.GetProperty("field"+i).SetValue(employees, "abcde");

Console.WriteLine(employees.field1); // Prints "abcde"

正如其他人所指出的那样,以这种方式使用反射似乎有点怀疑。看起来你应该采用不同的方式,例如使用Dictionary<string,string>

答案 2 :(得分:0)

您可以尝试使用反射

Type type = typeof(Employees);
PropertyInfo pi =  this.GetType().GetProperty();
pi.SetField(this, value);

以下是MSDN链接:https://msdn.microsoft.com/en-us/library/ms173183.aspx

答案 3 :(得分:0)

尝试这种方法(使用GetMembers())获取类的所有成员并循环它们。

Employees myEmployees = new Employees();
MemberInfo[] members = myType.GetMembers();

for (int i =0 ; i < members.Length ; i++)
{
    // Display name and type of the concerned member.
    Console.WriteLine( "'{0}' is a {1}", members[i].Name, members[i].MemberType);
}

答案 4 :(得分:0)

您可以使用反射来做到这一点:

        var myEmployees = new Employees();
        var properties = myEmployees.GetType().GetProperties();

        foreach (var field in properties)
        {
            field.SetValue(myEmployees, "NewValue");
        }

        // Print all field's values
        foreach (var item in properties)
        {
            Console.WriteLine(item.GetValue(myEmployees));
        }

否则,您可以使用列表或字典或创建新的结构,以使您更加灵活,并可以控制字段的更多属性:

    struct FieldProperties
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public string Type { get; set; }
        ...
    }


    List<FieldProperties> lst = new List<FieldProperties>();