是否可以使用IEnumerable对类中的字段进行foreach循环?

时间:2019-05-23 22:37:58

标签: c# reflection ienumerable

我想知道是否有可能使一个类的字段枚举,以便您可以使用for或foreach循环遍历它们。我看过几个版本,描述了如何以这种方式枚举包含其他结构的结构。

我也知道我可能完全错读了关于该主题的MSDN article

所以我的问题是,是否可以使用IEnumerable或类似的接口在类中的字段上进行迭代?

我想做这样的事情:

private class Integers
{
    public int int1;
    public int int2;
    public int int3;
    public int int4;
    public int int5;
    public int int6;
    public int int7;
    public int int8;
}

foreach(int I in Integers){
    Console.WriteLine(I); 
}

3 个答案:

答案 0 :(得分:0)

听起来像您在寻找一个枚举:enum docs

答案 1 :(得分:0)

可以使用Reflection遍历类中的字段。
这是一个示例:

public class MyClass
{
    public int I1;
    public int I2;
    public int I3;
    public int I4;
}
// typeof(MyClass).GetFields() return FieldInfo[], which is IEnumerable<T>
foreach (var field in typeof(MyClass).GetFields())
{
    Console.WriteLine(field.Name);
}

// I1
// I2
// I3
// I4

但是,您可能应该使用其他东西。数组可能更合适。

答案 2 :(得分:0)

可能与反射有关:

var Integers = new Integers{
    int1 = 50,
    int2 = 42,
    // etc. ...
};
foreach (var field in typeof(Integers).GetFields())
{
    Console.WriteLine(field.GetValue(Integers));
}

但是您想要这样做的事实可能表明您根本不应该使用类。

您要枚举吗?

private enum Integers
{
    int1 = 50,
    int2 = 42,
    // etc.
}

foreach (var value in Enum.GetValues(typeof(Integers)).Cast<int>())
{
    Console.WriteLine(value);
}

列表更合适吗?

var integers = new List<int>() { 50, 42, /*etc*/};
foreach (var value in integers)
{
    Console.WriteLine(value);
}

还是字典?

var integers = new Dictionary<string, int>() { 
["int1"] = 50, 
["int2"] = 42, 
/*etc*/
};
foreach (var keyValuePair in integers)
{
    Console.WriteLine(keyValuePair.Value);
}