[带有子/嵌套对象的Class的C#计数属性

问题描述 投票:-1回答:1

我具有以下类的构造,这里简化为称为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的属性,而我希望它返回DataClass 2 + PartClass 2 + MemberClass 1 + SideClass 3,总共可以通过DataClass设置8个属性。

有人可以帮我吗?

c# properties count parent-child
1个回答
1
投票
您可以使用Count()方法介绍界面

public interface ICountable { int Count(); }

您应该使用此界面来标记所有类型,哪些属性参与Count()计算。您可以在下面看到通用抽象类来实现此接口。通用T参数是需要计算其属性的类型。您只需实施一次计算逻辑,然后在需要时继承此类。您还要遍历所有属性,并实现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
© www.soinside.com 2019 - 2024. All rights reserved.