当前位置: 首页 > 知识库问答 >
问题:

如何递归和反射地获取所有可能的字段名路径的列表?

龚运乾
2023-03-14

我正在尝试获取一个字符串集合,该集合为我提供所有类成员的字段名,以分隔 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;
    }

我发现了几个相关的问题,但没有一个完全符合我的问题,我自己也无法跳转:递归地获取属性


共有1个答案

吕胤
2023-03-14

您需要一个递归实现:

HashSet<Type> nonRecursiveTypes = new HashSet<Type> { typeof(System.Int32), typeof(System.String) }; // add other simple types here
IEnumerable<string> GetFields(object obj)
{
    foreach (var field in obj.GetType().GetFields())
    {
        if (nonRecursiveTypes.Contains(field.FieldType))
            yield return field.Name;
        else
            foreach (var innerFieldName in GetFields(field.GetValue(obj)))
                yield return field.Name + "." + innerFieldName;
    }
}
 类似资料:
  • 问题内容: 这是我获得所有可能性的代码: 但是,如果要添加更多,则必须再添加一个循环。那么,我该如何使用递归呢?我尝试,我尝试,但是我真的做不到。请帮助并尽可能简单地发布示例。 谢谢。 问题答案: 这是一个简单的算法。从1迭代到2 count(array) -1。在每次迭代中,如果循环计数器的二进制表示形式中的第j位等于1,则在组合中包含第j个元素。 由于PHP需要能够将2个count(array

  • 在本例中,我希望保存foo/foo2、foo/foo3和foo/foo3/foo4。有什么想法吗?谢了!

  • 问题内容: 我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型。 例如,假设我有一堂课 现在,我想获得的所有私有字段(,,类)(如果不知道所有领域前期的名称),并检查它们的类型。 问题答案: 有可能获得与方法的所有字段的。然后,您必须检查每个字段的修饰符以查找私有字段: 请注意,这不会返回继承的字段。 最终,您可以使用Field.getType()方法获得字段的类型。

  • 现在,我想获取类的所有私有字段(、、)(事先不知道所有字段的名称)并检查它们的类型。

  • 我正在尝试编写一个递归方法,它可以找到一个路径,而不需要回溯到一个int矩阵中的一个位置,这个矩阵包含值0,1。0可以踩,1不行。我也限制了一条超过50步的路径。 Location是一个具有行和列值(x,y)的对象。locationEquals是一个函数,如果两个位置相同,则返回true,否则返回false。map变量是我试图在其中找到路径的矩阵。 执行以下代码后'选项'为空,这意味着它没有找到方

  • 下面是我的示例类,我希望通过在这行中使用反射来获取y和z字段(Field[]fields=forName.getDeclaredFields();)我得到了空数组。如果y和z不是类结构的一部分,那么它们属于哪一部分