Вы можете ввести интерфейс с Count()
методом
public interface ICountable
{
int Count();
}
И использовать этот интерфейс для отметки всех типов, свойства которых участвуют в расчете Count()
. Вы можете увидеть обобщенный класс c для реализации этого интерфейса ниже. Параметр Generi c T
- это тип, свойства которого необходимо рассчитать. Вы реализуете логику вычисления c только один раз и наследуете этот класс там, где это необходимо. Вы также go просматриваете все свойства, реализуя ICountable
, для их вычисления (своего рода рекурсия)
public abstract class Countable<T> : ICountable
{
public int Count()
{
Type t = typeof(T);
var properties = t.GetProperties();
var countable = properties.Select(p => p.PropertyType).Where(p => typeof(ICountable).IsAssignableFrom(p));
var sum = countable.Sum(c => c.GetProperties().Length);
return properties.Length + sum;
}
}
и наследуете его в своих классах
public class DataClass : Countable<DataClass>
{
...
}
public class PartClass : Countable<PartClass>
{
...
}
public class MemberClass : Countable<MemberClass>
{
...
}
public class SideClass : Countable<SideClass>
{
...
}
И это для теста
var dataClass = new DataClass();
var count = dataClass.Count();
Возвращает 8
как ожидалось