C# Подсчет свойств класса с дочерними / вложенными объектами - PullRequest
0 голосов
/ 16 января 2020

У меня есть следующая конструкция классов, которая здесь упрощена как дочерние классы «материнского» класса с именем DataClass, который также содержит один простой метод:

public class DataClass
{
    public int num { get; set; }
    public string code { get; set; }
    public PartClass part { get; set; }
    public MemberClass member { get; set; }

    public int Count()
    {
        Type t = typeof(DataClass);
        return typeof(DataClass).GetProperties().Length;
    }
}

public class PartClass
{
    public int seriesNum { get; set; }
    public string seriesCode { get; set; }
}

public class MemberClass
{
    public int versionNum { get; set; }
    public SideClass side { get; set; }
}

public class SideClass
{
    public string firstDetail { get; set; }
    public string secondDetail { get; set; }
    public bool include { get; set; }
}

Проблема в том, что я хочу реорганизовать метод, чтобы он мог дать мне точный подсчет всех найденных свойств, в том числе во вложенных или дочерних классах. В приведенном выше примере он учитывает только свойства DataClass, хотя я хотел, чтобы он возвращал 2 для DataClass + 2 для PartClass + 1 для MemberClass + 3 для SideClass, суммируя до 8 свойств, которые можно установить через DataClass.

Может ли кто-нибудь помочь мне с этим?

1 Ответ

1 голос
/ 16 января 2020

Вы можете ввести интерфейс с 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 как ожидалось

...