C# 如何从主类循环子类属性?

C# 如何从主类循环子类属性?,c#,C#,如何从主类循环子类属性 public class GroupA { public string FullName = "", BirthDay = ""; } public class GroupB { public string Email = ""; } public class GroupC { public string Phone; } public class MainGroup { public GroupA GroupA; public GroupB Gro

如何从主类循环子类属性

public class GroupA
{
  public string FullName = "", BirthDay = "";
}
public class GroupB
{
  public string Email = "";
}
public class GroupC
{
  public string Phone;
}

public class MainGroup
{
  public GroupA GroupA;
  public GroupB GroupB;
  public GroupC GroupC;
}


    protected void Page_Load(object sender, EventArgs e)
    {

      GroupA  NewGroupA = new GroupA();
              NewGroupA.FullName="TEST MASTER";
              NewGroupA.BirthDay="02/20/1984";
      GroupB  NewGroupB = new GroupB();
              NewGroupB.Email="noreply@test.com"; 
      GroupC  NewGroupC=new GroupC();
              NewGroupC.Phone="555 123 4567";

      //Assign new class instances to the main class
      MainGroup NewMainGroup= new MainGroup();
                NewMainGroup.GroupA=NewGroupA;
                NewMainGroup.GroupB=NewGroupB;                 
                NewMainGroup.GroupC=NewGroupC;

      //Loop through the main class

      foreach (var Group in typeof(MainGroup).GetFields())
      {
        Response.Write("<BR>MainGroupName=  " + Group.Name + " Value=  " + Group.GetValue(NewMainGroup).ToString());
        //PROBLEM IS HERE. Can't loop through the subclass We need to display the GroupA, GroupB, GroupC below.
        foreach (var SubGroup in Group)
        {
          Response.Write("<BR>");
        }


      }
}
公共类GroupA
{
公共字符串FullName=“”,生日=“”;
}
公共类B组
{
公共字符串Email=“”;
}
公共类GroupC
{
公用串电话;
}
公共类主组
{
公共团体;
公共分组b分组b;
公共团体;
}
受保护的无效页面加载(对象发送方、事件参数e)
{
GroupA NewGroupA=新GroupA();
NewGroupA.FullName=“测试主机”;
NewGroupA.birth=“1984年2月20日”;
GroupB NewGroupB=NewGroupB();
NewGroupB.Email=”noreply@test.com"; 
GroupC NewGroupC=NewGroupC();
NewGroupC.Phone=“555 123 4567”;
//将新类实例分配给主类
MainGroup NewMainGroup=新MainGroup();
NewMainGroup.GroupA=NewGroupA;
NewMainGroup.GroupB=NewGroupB;
NewMainGroup.GroupC=NewGroupC;
//循环遍历主类
foreach(typeof(MainGroup).GetFields()中的变量组)
{
Response.Write(“
MainGroupName=“+Group.Name+”Value=“+Group.GetValue(NewMainGroup.ToString()); //问题就在这里。无法循环通过子类,我们需要显示下面的GroupA、GroupB、GroupC。 foreach(组中的var子组) { 响应。写入(“
”); } } }
您应该存储对组变量(而不仅仅是类型)的引用。因此,如果您使用代码并执行以下操作:

foreach (var GroupType in typeof(MainGroup).GetFields())
{
    object Group = GroupType.GetValue(NewMainGroup);
    Response.Write("<BR>MainGroupName=  " + GroupType.Name + " Value=  " + Group.ToString());
    foreach(var SubGroupType in Group.GetType().GetFields()) {
        object SubGroup = SubGroupType.GetValue(Group);
        Response.Write("<BR>SubGroupName= " + SubGroupType.Name + " Value= " + SubGroup.ToString());
    }
}
foreach(typeof(MainGroup).GetFields()中的var GroupType)
{
对象组=GroupType.GetValue(NewMainGroup);
Response.Write(“
MainGroupName=“+GroupType.Name+”Value=“+Group.ToString()”); foreach(组中的var subtype.GetType().GetFields()){ 对象子组=子类型.GetValue(组); Response.Write(“
SubGroup Name=“+subtype.Name+”Value=“+SubGroup.ToString()”); } }
我还没有测试过,但我认为这应该和工作有关。至少让你开始吧

哦,顺便说一句,我想我有一个更好的方法给你,试试这个:

public Dictionary<string, object> GetObjectFields(object obj) {
    var dict = new Dictionary<string, object>();
    var t = obj.GetType();
    foreach(var f in t.GetFields()) {
        dict[f.Name] = f.GetValue(obj);
    }
    return dict;
}
公共字典GetObjectFields(对象obj){
var dict=新字典();
var t=obj.GetType();
foreach(t.GetFields()中的变量f){
dict[f.Name]=f.GetValue(obj);
}
返回命令;
}
然后您可以简单地执行以下操作:

var groupVars = GetObjectFields(NewMainGroup);
foreach(var gv in groupVars) {
    Response.Write(<BR>MainGroupName=  " + gv.Key + " Value=  " + gv.Value.ToString());
    var subGroupVars = GetObjectFields(gv.Value);
    foreach(var sgv in subGroupVars) {
        Response.Write(<BR>SubGroupName=  " + sgv.Key + " Value=  " + sgv.Value.ToString());
    }
}
var-groupVars=GetObjectFields(NewMainGroup);
foreach(组变量中的变量gv){
Response.Write(
MainGroupName=“+gv.Key+”Value=“+gv.Value.ToString()); var SUBSUBVARS=GetObjectFields(gv.Value); foreach(子变量中的变量sgv){ Response.Write(
subname=“+sgv.Key+”Value=“+sgv.Value.ToString()); } }
您应该存储对组变量(而不仅仅是类型)的引用。因此,如果您使用代码并执行以下操作:

foreach (var GroupType in typeof(MainGroup).GetFields())
{
    object Group = GroupType.GetValue(NewMainGroup);
    Response.Write("<BR>MainGroupName=  " + GroupType.Name + " Value=  " + Group.ToString());
    foreach(var SubGroupType in Group.GetType().GetFields()) {
        object SubGroup = SubGroupType.GetValue(Group);
        Response.Write("<BR>SubGroupName= " + SubGroupType.Name + " Value= " + SubGroup.ToString());
    }
}
foreach(typeof(MainGroup).GetFields()中的var GroupType)
{
对象组=GroupType.GetValue(NewMainGroup);
Response.Write(“
MainGroupName=“+GroupType.Name+”Value=“+Group.ToString()”); foreach(组中的var subtype.GetType().GetFields()){ 对象子组=子类型.GetValue(组); Response.Write(“
SubGroup Name=“+subtype.Name+”Value=“+SubGroup.ToString()”); } }
我还没有测试过,但我认为这应该和工作有关。至少让你开始吧

哦,顺便说一句,我想我有一个更好的方法给你,试试这个:

public Dictionary<string, object> GetObjectFields(object obj) {
    var dict = new Dictionary<string, object>();
    var t = obj.GetType();
    foreach(var f in t.GetFields()) {
        dict[f.Name] = f.GetValue(obj);
    }
    return dict;
}
公共字典GetObjectFields(对象obj){
var dict=新字典();
var t=obj.GetType();
foreach(t.GetFields()中的变量f){
dict[f.Name]=f.GetValue(obj);
}
返回命令;
}
然后您可以简单地执行以下操作:

var groupVars = GetObjectFields(NewMainGroup);
foreach(var gv in groupVars) {
    Response.Write(<BR>MainGroupName=  " + gv.Key + " Value=  " + gv.Value.ToString());
    var subGroupVars = GetObjectFields(gv.Value);
    foreach(var sgv in subGroupVars) {
        Response.Write(<BR>SubGroupName=  " + sgv.Key + " Value=  " + sgv.Value.ToString());
    }
}
var-groupVars=GetObjectFields(NewMainGroup);
foreach(组变量中的变量gv){
Response.Write(
MainGroupName=“+gv.Key+”Value=“+gv.Value.ToString()); var SUBSUBVARS=GetObjectFields(gv.Value); foreach(子变量中的变量sgv){ Response.Write(
subname=“+sgv.Key+”Value=“+sgv.Value.ToString()); } }
如果我正确理解了你的问题,我认为以下代码就是你的答案:

foreach (var group in NewMainGroup.GetType().GetFields())
{
    var groupInstance = group.GetValue(NewMainGroup);
    foreach (var subGroup in groupInstance.GetType().GetFields())
    {
        Response.Write("<br />" + subGroup.Name + " = " + subGroup.GetValue(groupInstance));
    }
}
foreach(NewMainGroup.GetType().GetFields()中的var组)
{
var groupInstance=group.GetValue(NewMainGroup);
foreach(groupInstance.GetType().GetFields()中的var子组)
{
Response.Write(“
”+subGroup.Name+“=”+subGroup.GetValue(groupInstance)); } }
如果我正确理解了你的问题,我认为以下代码就是你的答案:

foreach (var group in NewMainGroup.GetType().GetFields())
{
    var groupInstance = group.GetValue(NewMainGroup);
    foreach (var subGroup in groupInstance.GetType().GetFields())
    {
        Response.Write("<br />" + subGroup.Name + " = " + subGroup.GetValue(groupInstance));
    }
}
foreach(NewMainGroup.GetType().GetFields()中的var组)
{
var groupInstance=group.GetValue(NewMainGroup);
foreach(groupInstance.GetType().GetFields()中的var子组)
{
Response.Write(“
”+subGroup.Name+“=”+subGroup.GetValue(groupInstance)); } }
首先,GroupA、GroupB和GroupC不是MainGroup的子类。 您正在使用组合,并且有属于GroupA、GroupB和GroupC类型的成员

不知道为什么要在已经知道类型的情况下重新反射类型。 您可以使用MainGroup.GroupA.Name等等。也许你发布的代码只是一个例子

以下方法应反映基本结构并适合您的目的

        static String Reflect(Object data)
        {
            StringBuilder stringBuilder = new StringBuilder();

            foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
            {
                if (propertyInfo.PropertyType.IsClass && propertyInfo.PropertyType != typeof(String))
                {
                    stringBuilder.AppendFormat("{0} : {1} {2}", propertyInfo.Name, Environment.NewLine 
                        , Reflect(propertyInfo.GetValue(data, null)));
                }
                else
                {
                   stringBuilder.AppendFormat("{0} = {1}, {2}", propertyInfo.Name,  propertyInfo.GetValue(data, null), Environment.NewLine);
                }
            }

            return stringBuilder.ToString();
        }
用法:

            MainGroup main = new MainGroup
            {
                A = new GroupA { Name = "GroupA", ID = 1 },
                B = new GroupB { Date = DateTime.UtcNow },
                C = new GroupC { HasData = false }
            };

            Reflect(main);

首先,GroupA、GroupB和GroupC不是MainGroup的子类。 您正在使用组合,并且有属于GroupA、GroupB和GroupC类型的成员

不知道为什么要在已经知道类型的情况下重新反射类型。 您可以使用MainGroup.GroupA.Name等等。也许你发布的代码只是一个例子

以下方法应反映基本结构并适合您的目的

        static String Reflect(Object data)
        {
            StringBuilder stringBuilder = new StringBuilder();

            foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
            {
                if (propertyInfo.PropertyType.IsClass && propertyInfo.PropertyType != typeof(String))
                {
                    stringBuilder.AppendFormat("{0} : {1} {2}", propertyInfo.Name, Environment.NewLine 
                        , Reflect(propertyInfo.GetValue(data, null)));
                }
                else
                {
                   stringBuilder.AppendFormat("{0} = {1}, {2}", propertyInfo.Name,  propertyInfo.GetValue(data, null), Environment.NewLine);
                }
            }

            return stringBuilder.ToString();
        }
用法:

            MainGroup main = new MainGroup
            {
                A = new GroupA { Name = "GroupA", ID = 1 },
                B = new GroupB { Date = DateTime.UtcNow },
                C = new GroupC { HasData = false }
            };

            Reflect(main);

它似乎返回空变量。foreach(Group.GetV中的var子组