C# 如何在C中递归地从嵌套类中检索成员字段
我正在调用GetEmployee方法,该方法返回Employee类型的值并存储在emp变量中C# 如何在C中递归地从嵌套类中检索成员字段,c#,c#-4.0,nested-class,C#,C# 4.0,Nested Class,我正在调用GetEmployee方法,该方法返回Employee类型的值并存储在emp变量中 var emp = GetEmployee(); 我需要检索Employee类的所有成员字段,如age、name以及嵌套类的成员,如 [Address->DoorNum,Street,Zip] [Phone->mobile,homePhone], [Dependents->name,age, [phone->mobile,homePhone]] 递归地从emp变量开始 va
var emp = GetEmployee();
我需要检索Employee类的所有成员字段,如age、name以及嵌套类的成员,如
[Address->DoorNum,Street,Zip]
[Phone->mobile,homePhone],
[Dependents->name,age,
[phone->mobile,homePhone]]
递归地从emp变量开始
var emp = GetEmployee();
班级结构如下:
class Employee
{
int age;
string name
Address address;
Phone[] phones;
Dependents[] dependents;
}
class Address
{
int DoorNum;
string Street;
int Zip;
}
class Phone
{
string mobile;
string homePhone;
}
class Dependents
{
string name;
int age;
Phone depPhone;
}
您能帮助我如何实现这一点吗?如果您讨论的是在运行时动态检索字段,那么下面是一个简单的递归示例,其目的不仅仅是为了说明实用性。请注意,默认情况下,类字段被推断为私有字段
public static void listFields(Type type, bool sameNamespace, int nestLevel = 1) {
BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
Console.WriteLine("\r\n{0}Fields of {1}:", tabs(nestLevel - 1), type.Name);
foreach (FieldInfo f in type.GetFields(bf)) {
Console.WriteLine("{0}{1} {2} {3}", tabs(nestLevel), (f.IsPublic ? "public" : "private"), f.FieldType.Name, f.Name);
Type fieldType = (f.FieldType.IsArray) ? f.FieldType.GetElementType() : f.FieldType;
if ((type != fieldType) && (!sameNamespace || fieldType.Namespace == type.Namespace)) {
listFields(fieldType, sameNamespace, nestLevel + 2);
}
}
Console.WriteLine();
}
private static String tabs(int count) { return new String(' ', count * 3); }
ListFieldsTypeOffemployee的输出,true;:
如果您想要实际获取实例字段的值,您可以使用如果您正在谈论在运行时动态检索字段,这里有一个简单的递归示例,其目的不仅仅是为了说明实用性。请注意,默认情况下,类字段被推断为私有字段
public static void listFields(Type type, bool sameNamespace, int nestLevel = 1) {
BindingFlags bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
Console.WriteLine("\r\n{0}Fields of {1}:", tabs(nestLevel - 1), type.Name);
foreach (FieldInfo f in type.GetFields(bf)) {
Console.WriteLine("{0}{1} {2} {3}", tabs(nestLevel), (f.IsPublic ? "public" : "private"), f.FieldType.Name, f.Name);
Type fieldType = (f.FieldType.IsArray) ? f.FieldType.GetElementType() : f.FieldType;
if ((type != fieldType) && (!sameNamespace || fieldType.Namespace == type.Namespace)) {
listFields(fieldType, sameNamespace, nestLevel + 2);
}
}
Console.WriteLine();
}
private static String tabs(int count) { return new String(' ', count * 3); }
ListFieldsTypeOffemployee的输出,true;:
如果您想实际获取实例字段的值,可以使用最后我得到了问题的答案:
public Employee getEmployee()
{
var emp=EmployeeProxy.GetEmployee();
return new Employee {
name=emp.Name,
age=emp.Age,
address=emp.AddressType.Select(a=>new Address{
DoorNum=a.doorNum,
Street=ae.street,
Zip=a.zip,
}),
phones=new Phone[]{
mobile=PhoneType.Mobile,
homePhone=PhoneType.HomePhone,
},
dependents=emp.DependentsType.Select(d=>new Dependents{
name=d.Name,
age=d.Age,
depPhone=new Phone{
mobile=d.DependentPhone.Mobile,
homePhone=d.DependentPhone.HomePhone,
},
}),
}; //End of Return
} //End of method
最后我得到了我问题的答案:
public Employee getEmployee()
{
var emp=EmployeeProxy.GetEmployee();
return new Employee {
name=emp.Name,
age=emp.Age,
address=emp.AddressType.Select(a=>new Address{
DoorNum=a.doorNum,
Street=ae.street,
Zip=a.zip,
}),
phones=new Phone[]{
mobile=PhoneType.Mobile,
homePhone=PhoneType.HomePhone,
},
dependents=emp.DependentsType.Select(d=>new Dependents{
name=d.Name,
age=d.Age,
depPhone=new Phone{
mobile=d.DependentPhone.Mobile,
homePhone=d.DependentPhone.HomePhone,
},
}),
}; //End of Return
} //End of method
你能为你想做的事情提供更多的背景吗?有很多方法可以解决这个问题,从您自己的库到第三方库。您想对数据执行的操作将对您的操作方式产生影响。您是想创建Employee对象还是仅仅提取变量?还是要在运行时获取属性名称?我不太确定你到底想要什么。这不是递归。一些web服务请求返回Employee类型的值。我的班级结构和上面提到的一样。我需要创建一个包含返回值的Employee对象。但我无法在家属体内找回电话。它只给员工一个级别的值。你能为你想做的事情提供更多的上下文吗?有很多方法可以解决这个问题,从您自己的库到第三方库。您想对数据执行的操作将对您的操作方式产生影响。您是想创建Employee对象还是仅仅提取变量?还是要在运行时获取属性名称?我不太确定你到底想要什么。这不是递归。一些web服务请求返回Employee类型的值。我的班级结构和上面提到的一样。我需要创建一个包含返回值的Employee对象。但我无法在家属体内找回电话。它只给予员工一个层次的价值。