Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中递归地从嵌套类中检索成员字段_C#_C# 4.0_Nested Class - Fatal编程技术网

C# 如何在C中递归地从嵌套类中检索成员字段

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

我正在调用GetEmployee方法,该方法返回Employee类型的值并存储在emp变量中

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对象。但我无法在家属体内找回电话。它只给予员工一个层次的价值。