【发布时间】:2019-09-12 16:39:53
【问题描述】:
我正在尝试获取一个字符串集合,该集合为我提供所有班级成员的字段名称,以.s 分隔。例如:
public class Apple
{
public Banana MyBanana = new Banana();
public Cranberry MyCranberry = new Cranberry();
}
public class Banana
{
public int MyNumber = 5;
public Cranberry MyCranberry = new Cranberry();
}
public class Cranberry
{
public string MyString = "Hello!";
public int MyOtherNumber = 10;
}
public class Demo
{
public List<string> GetFields(Type Apple)
{
//I can't figure this out
//But it should return a list with these elements:
var result = new List<string>
{
"MyBanana.MyNumber",
"MyBanana.MyCranberry.MyString",
"MyBanana.MyCranberry.MyOtherNumber",
"MyCranberry.MyString",
"MyCranberry.MyOtherNumber"
};
return result;
}
}
我认为需要某种递归和反射,但是在编写了几个小时功能失调的代码之后,我需要一些帮助。
我需要这个的原因是因为我正在访问使用这些文件路径作为它们各自值的键的第三方代码。
一次失败尝试的示例:
private List<string> GetFields(Type type)
{
var results = new List<string>();
var fields = type.GetFields();
foreach (var field in fields)
{
string fieldName = field.Name;
if (field.ReflectedType.IsValueType)
{
results.Add(fieldName);
}
else
{
results.Add(field.Name + GetFields(field.FieldType));
}
}
return results;
}
我找到了几个相关的问题,但没有一个完全符合我的问题,而且我自己也无法跳出:Recursively Get Properties & Child Properties Of A Class, https://stackoverflow.c"om/questions/6196413/how-to-recursively-print对象属性使用反射的值,Recursively Get Properties & Child Properties Of An Object,.NET, C#, Reflection: list the fields of a field that, itself, has fields
【问题讨论】:
-
Apple.GetFields(BindingFlags.Public).ToList();这会给你一个List<Fields>。然后,您可以通过将字段名称转换为您需要的List<string>来转换它 -
你目前的结果是什么?您需要 Reflection (GetFields) 来获取第一级属性,然后对于每个属性,获取它的类型并再次递归地使用 GetField。
标签: c# recursion reflection key-value