Можно ли сделать цикл foreach для полей в классе, используя IEnumerable? - PullRequest
2 голосов
/ 24 мая 2019

Мне было интересно, можно ли сделать поля класса перечисляемыми, чтобы вы могли перебирать их с помощью цикла for или foreach.Я видел несколько версий, описывающих, как сделать так, чтобы структура, содержащая другие структуры, была перечислена таким образом.

Я также знаю, что, возможно, полностью неверно прочитал статью MSDN по этому вопросу.

Итак, мой вопрос: возможно ли перебирать поля в классе, используя 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 голосов
/ 24 мая 2019

Можно перебирать поля в классе, используя Отражение .
Вот пример:

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

Однако вам, вероятно, следует использовать что-то еще. Массив может быть лучше подойдет.

0 голосов
/ 24 мая 2019

Можно сделать с Reflection:

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);
}
0 голосов
/ 24 мая 2019

Похоже, вы ищете перечисление: enum docs

...