Как мне рекурсивно и рефлексивно получить список всех возможных путей имен полей? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь получить коллекцию строк, которые дают мне имена полей всех моих учеников, разделенные . с.Например:

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;
    }

Я нашел несколько связанных вопросов, но ни одногоиз них точно соответствуют моему вопросу, и я не смог сделать прыжок сам: Рекурсивно получить свойства и дочерние свойства класса , https://stackoverflow.c"om/questions/6196413/how-to-recursively-print-the-values-of-an-objects-properties-using-reflection, Рекурсивно получить свойства и дочерние свойства AnОбъект , .NET, C #, Reflection: перечислить поля поля, которое само имеет поля

1 Ответ

3 голосов
/ 23 апреля 2019

Вам нужна рекурсивная реализация:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...