Как мне обойти приведение к FieldInfo? - PullRequest
0 голосов
/ 03 мая 2020

Как мне обойти приведение к FieldInfo? С кодом ниже он генерирует InvalidCastException, когда производный класс имеет переменную, например, bool. Проблема в том, что он также возвращает ноль в качестве значения поля. (все происходит в последних 5 строках, но я вставляю больше для контекста)

    {
        string paramsData = ".";
        if (param == null)
        {
            return paramsData;
        }
        BindingFlags bindingFlags = BindingFlags.Public |
                        BindingFlags.NonPublic |
                        BindingFlags.Instance |
                        BindingFlags.Static;
        FieldInfo[] paramFields = param.GetType().GetFields(bindingFlags);

        foreach (FieldInfo field in paramFields)
        {
            paramsData += field.Name;
            Param child = (Param)field.GetValue(param);
            paramsData += GetParamDataInChildren(child);
        }
        return paramsData;
    }

1 Ответ

0 голосов
/ 03 мая 2020

Трудно понять, чего вы пытаетесь достичь, но похоже, что вы должны проверять тип своего поля перед вызовом GetValue. Например:

if (field.FieldType == typeof(Param))
{
    Param child = (Param)field.GetValue(param);
    paramsData += GetParamDataInChildren(child);
}

Обратите внимание, что child все еще может быть нулевым в этом случае, и вы должны проверить это, если последующая функция не обрабатывает его.

[EDIT] Если вы пытаетесь рекурсивно получить все поля, независимо от типа, вы должны заставить свою рекурсивную функцию принимать Object вместо Param, и тогда вам не нужно приводить к Param, поскольку GetValue возвращает Object.

...