Как получить наследование членов класса int? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть базовый класс, подобный этому:

public class Marker {
     public int[] GetChildMarks() {
          //Somehow Get Child int members
     }
     public int ShallNotBeInArray;
}

public class MyMarker : Marker {
   public int Size, Number;
}

public class TedsMarker : Marker {
   public int Power;
}

//... somewhere in main
var m = new MyMarker(){Size=3, Number = 666};
var arr = m.GetChildMarks(); // [Size, Number, Any other ints in MyMarker ]
var t = new TedsMarker() {Power=999};
var arr2 = t.GetChildMarks(); // [Power, Any other ints in TedsMarker] 

Так возможно ли и как можно сделать такую ​​вещь в C#, используя отражение?

1 Ответ

1 голос
/ 30 марта 2020

Это может быть достигнуто следующим образом:

public class Marker
{
    public int[] GetChildMarks()
    {
        return new int[]
        {
            (int)GetType().GetField("Size").GetValue(this),
            (int)GetType().GetField("Number").GetValue(this)
        };
    }
    public int ShallNotBeInArray;
}

Предполагается, что у дочернего класса есть эти два поля, и они имеют тип int.

Поскольку принудительного применения нет ( и на самом деле их не может быть, потому что это поля, а не свойства), этот подход является хорошим кандидатом для получения ошибок времени выполнения.

РЕДАКТИРОВАТЬ:

Можно извлечь значения всех полей как это:

public class Marker
{
    public int[] GetChildMarks()
    {
        List<int> allIntegerFields = new List<int>();
        // DeclaredOnly: only get fields declared by this type, not the ones declared by base classes
        // Public | Instance: Only get non-static, public fields
        foreach(FieldInfo fieldInfo in GetType().GetFields(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance))
        {
            if(fieldInfo.FieldType == typeof(int))
            {
                allIntegerFields.Add((int)fieldInfo.GetValue(this));
            }
        }
        return allIntegerFields.ToArray();
    }
    public int ShallNotBeInArray;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...