C# 计算 Class 和 child/nested 个对象的属性
C# Counting properties of Class with child/nested objects
我有以下 classes 的构造,这里简化为 'mother' class 的子 classes 称为 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; }
}
问题是,我想重构该方法,以便它可以准确计算找到的所有属性,包括嵌套或子 classes 中的属性。在上面的示例中,它只计算 DataClass 的属性,而我希望它 return DataClass 2 + PartClass 2 + MemberClass 1 + SideClass 3,总共可以通过 DataClass 设置 8 个属性。
有人可以帮我解决这个问题吗?
可以用Count()
方法引入接口
public interface ICountable
{
int Count();
}
并使用这个接口来标记所有类型,哪些属性正在参与Count()
计算。
您可以在下面看到实现此接口的通用抽象 class。 Generic T
参数是需要计算其属性的类型。您只需实现一次计算逻辑,并在需要时继承此 class。您还将遍历所有属性,实现 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;
}
}
并在您的 classes
中继承它
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();
符合预期returns8
我有以下 classes 的构造,这里简化为 'mother' class 的子 classes 称为 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; }
}
问题是,我想重构该方法,以便它可以准确计算找到的所有属性,包括嵌套或子 classes 中的属性。在上面的示例中,它只计算 DataClass 的属性,而我希望它 return DataClass 2 + PartClass 2 + MemberClass 1 + SideClass 3,总共可以通过 DataClass 设置 8 个属性。
有人可以帮我解决这个问题吗?
可以用Count()
方法引入接口
public interface ICountable
{
int Count();
}
并使用这个接口来标记所有类型,哪些属性正在参与Count()
计算。
您可以在下面看到实现此接口的通用抽象 class。 Generic T
参数是需要计算其属性的类型。您只需实现一次计算逻辑,并在需要时继承此 class。您还将遍历所有属性,实现 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;
}
}
并在您的 classes
中继承它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();
符合预期returns8