2011-05-28 40 views
0

如何從主類循環子類屬性?如何從主類循環子類屬性?

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="[email protected]"; 
     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>"); 
     } 


     } 
} 
+0

現在看來似乎返回null變量。 ());}};}}(){0}(){0}這個函數返回一個新的數組。 Response.Write(「
變量值NULL HERE」+ SubGroup.GetValue(SubGroup).ToString()+「Value =」); } – SMTPGUY01 2011-05-28 14:18:30

+0

對不起,讓我重寫一個正確的答案...只是給我一秒。 – Alxandr 2011-05-28 14:34:05

+0

更新你的問題。你問如何循環一個類的​​屬性。這些都不是屬性。屬性具有get-set訪問器。請參閱:http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx BTW:您應該使用屬性而不是字段來處理這些類型的信息。 – MikeTeeVee 2011-05-28 15:07:04

回答

1

你應該如何存儲對組變量的引用(不僅僅是類型)。所以,如果你拿你的代碼,並做這樣的事情:

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()); 
    } 
} 

沒有測試過,但我認爲這應該工作。至少讓你開始。

哦,順便說一下,我覺得我對你有一個更好的方法,試試這個:

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; 
} 

然後,你可以簡單地這樣做:

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()); 
    } 
} 
3

如果我理解你的問題沒錯,我認爲這段代碼是你的答案:

1

第一件事第一件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); 
+0

謝謝你們。再次謝謝你 – SMTPGUY01 2011-05-28 14:53:44