Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Обращение к полям класса по имени

#c_sharp


Допустим есть класс 

class A 
{
    public int Age;
    public string Name;
}


Что необходимо сделать чтобы можно инициализировать поля экземпляр класса через instance["Age"] = 5;
И возможно ли такое?
    


Ответы

Ответ 1



Это можно сделать с помощью индексатора ([]) и рефлексии. Примерный код: public object this[string fieldName] { get { var field = this.GetType().GetField(fieldName); return field.GetValue(this); } set { var field = this.GetType().GetField(fieldName); field.SetValue(this, value); } } Данный код работает для всех экземплярных полей. Если вам надо устанавливать в т.ч. и статические поля -- нужно изменить код. Также по-хорошему нужно добавить валидацию (например, что указано имя существующего поля, или что тип устанавливаемого значения соответствует типу поля) и кэширование списка полей (чтобы запрашивать их только один раз). Хотя лучше всего таки использовать сами поля или свойства. Или заменить ваш класс на словарь, где ключом будем являться имя поля/свойства.

Ответ 2



инициализировать поля экземпляр класса через instance["Age"] = 5; И возможно ли такое? Можно просто написать instance.Age = 5;. Для этого надо использовать dynamic и ExpandoObject. Пример - тут.

Ответ 3



переопредилить оператор [] что то вроде этого: class a { public int age; public string name; public object this[int i] { get { return age[i]; } set { age[i] = value; } } }

Комментариев нет:

Отправить комментарий