Страницы

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

вторник, 28 января 2020 г.

Доступ к полю или свойству по имени

#c_sharp #net


В ActionScript 3 есть такой способ доступа к полям и свойствам экземпляра 
obj.name = "value1"; // прямой доступ
trace(obj.name); // value1
obj["name"] = "value2"; // доступ по имени 
trace(obj.name); // value2

Какие есть варианты реализации такой штуки на C#?
(в догонку - возможно ли итерировать (foreach) по именам/значениям свойств?)    


Ответы

Ответ 1



Проще всего через reflection: FieldInfo fi = typeof(YourClass).GetField("field_name_here"); object fieldValue = fi.GetValue(yourClassInstance); Итерировать можно тоже, см. пример в самом низу страницы: http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.aspx А вообще, обычно такое не нужно. Если вы расскажете, зачем вам это, может быть, мы предложим более удобный и правильный (и быстрый!) вариант.

Ответ 2



судя по всему, вам поможет рефлексия (она же "отражения"). О ней много где написано, скажу лишь, что получение информации о типе - довольно дорогая с точки зрения производительности операция. И без серьезной необходимости прибегать к ней не стоит

Ответ 3



Если я правильно понял, то можно сделать как-то так: // Поле класса по имени public object this[string key] { get { var prop = GetType().GetProperties(); var p = prop.FirstOrDefault(x => x.Name == key); if (p == null) return null; return p.GetValue(this, null); } set { var prop = GetType().GetProperties(); var p = prop.FirstOrDefault(x => key == x.Name); if (p == null) return; p.SetValue(this, value, null); } }

Ответ 4



Можно написать некоторый костыль, который будет имитировать такое поведение, перегрузив оператор [] class LikeActionScriptClass { public int Id{get;set;} public string Name{get;set;} public object this[string propName] { get { switch(propName) { case "Id": return Id; case "Name": return Name; } return null; } set { switch(propName) { case "Id": Id = (int)value; break; case "Name": Name = (string)value; break; } } } } использование: LikeActionScriptClass obj = new LikeActionScriptClass(); obj.Name = "name"; // прямой доступ obj.Name.Dump(); // name obj["Name"] = "name2"; // доступ по имени obj["Name"].Dump(); // name2

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

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