Подтвердить что ты не робот

С# Reflection - Получить значения полей из простого класса

У меня есть класс:

class A {
    public string a = "A-val" , b = "B-val";
}

Я хочу напечатать элементы объекта отражением

//Object here is necessary.
Object data = new A();
FieldInfo[] fields = data.GetType().GetFields();
String str = "";
foreach(FieldInfo f in fields){
    str += f.Name + " = " + f.GetValue(data) + "\r\n";
}

Вот желаемый результат:

a = A-val
b = B-val

К сожалению, это не сработало. Пожалуйста, помогите, спасибо.

4b9b3361

Ответ 1

Как только исправлено, чтобы избавиться от ошибок (без полутолбы и имя плохой переменной), код, который вы опубликовали, работает - я только что попробовал, и он без проблем обнаружил имена и значения.

Я предполагаю, что на самом деле вы пытаетесь использовать поля, которые не являются общедоступными. Этот код:

FieldInfo[] fields = data.GetType().GetFields();

... будут доступны только открытые поля. Обычно вам нужно указать, что вы также хотите непубличные поля:

FieldInfo[] fields = data.GetType().GetFields(BindingFlags.Public | 
                                              BindingFlags.NonPublic | 
                                              BindingFlags.Instance);

(надеюсь, у вас действительно нет публичных полей, в конце концов...)

Ответ 2

Помните, когда вы пишете такие поля, как:

public string VarName{ get; set;}

Тогда на самом деле у вас есть этот код (это то, что видит отражение):

private string _varName;
public string get_VarName(){
....
}
public void set_VarName(strig value){
....
}

Ответ 3

Как говорит @Stanislav, вы должны иметь в виду поля поддержки, созданные компилятором для свойств. Если вы хотите исключить эти поля, вы можете использовать следующий код:

FieldInfo[] fields = data.GetType()
    .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null)
    .ToArray();