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子组