2013-07-25 3 views
0

После ответа this ответ, я пытаюсь реплицировать его и перебирать свойства CustomerModel.Использование отражения в C#

CustomerModel pippo = new CustomerModel(); 
Type customer = pippo.GetType(); 
FieldInfo[] fields = customer.GetFields(BindingFlags.Public | BindingFlags.Instance); 

При использовании отладчика fields всегда имеет count = 0 но CustomerModel имеет много открытых свойств, которые я хотел бы видеть в полях. Как я могу это сделать? Вот выдержка из некоторых объявленных свойств, которые я хотел бы увидеть.

[DataMember] 
    public String Id { get; set; } 

    [DataMember] 
    public String LoginName { get; set; } 

    [DataMember] 
    public String Password { get; set; } 

    [DataMember] 
    public String CreationDate { get; set; } 

Возможно, неправильные флаги привязки? Я новичок в использовании рефлексии.

+0

Я бы рекомендовал изменить имя переменной с 'customer' на' customerType' или что-то в этом роде. 'customer' больше напоминает экземпляр' CustomerModel', а не его тип. –

+0

Да, я больше не буду хранить переменную, но просто получаю свойства ... Это было просто для целей тестирования. – Saturnix

ответ

6

Это свойства, а не поля. Используйте GetProperties вместо GetFields.

В C#:

public class Foo { 

    // this is a field: 
    private string _name; 

    // this is a property: 
    public string Name { get; set; } 

    // this is also a property: 
    public string SomethingElse { get { return _name; } set { _name = value; } } 

} 
+0

Он работает! Большое спасибо и простите глупый вопрос, но это действительно первый раз, когда я использую размышления ... Еще раз спасибо! :) – Saturnix

+0

Нет проблем. По мере того как вы все больше и больше размышляете, вы найдете всевозможные классные вещи, которые вы можете с ним сделать (и много опасных вещей тоже :)) –

2

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

FieldInfo[] fields = customer.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
+0

+1 Мне сейчас не интересно получать частные поля, но это что-то новое, что я только что узнал - спасибо за публикацию! – Saturnix

Смежные вопросы