Получение переменной по имени в C#

Есть ли способ получить значение переменной, просто зная ее имя, например:

double temp = (double)MyClass.GetValue("VariableName");

Когда я обычно обращался к такой переменной

double temp = MyClass.VariableName;

person Andreas    schedule 19.02.2011    source источник
comment
Мне любопытно, в каком контексте вам нужно это сделать, когда доступа к значению как к свойству обычно недостаточно.   -  person Corey Sunwold    schedule 20.02.2011


Ответы (1)


Вы можете использовать отражение. Например, если PropertyName является общедоступным свойством на MyClass и у вас есть экземпляр этого класса вы можете:

MyClass myClassInstance = ...
double temp = (double)typeof(MyClass).GetProperty("PropertyName").GetValue(myClassInstance, null);

Если это общедоступное поле:

MyClass myClassInstance = ...
double temp = (double)typeof(MyClass).GetField("FieldName").GetValue(myClassInstance);

Конечно, вы должны знать, что отражение не бесплатно. Может быть снижение производительности по сравнению с прямым доступом к свойству/полю.

person Darin Dimitrov    schedule 19.02.2011
comment
Будь осторожен; это может быть очень медленным, используя это часто. - person Emond Erno; 20.02.2011
comment
Будет ли отражение медленнее, чем фильтр с 10 переключателями? - person Andreas; 20.02.2011
comment
@Andeas, не дурацкая идея, держу пари, что отражение за 5 баксов будет медленнее, но лучше всего было бы измерить его, чтобы быть уверенным, и вам лучше быть уверенным, прежде чем запускать какой-либо код в производство. - person Darin Dimitrov; 20.02.2011
comment
@Андреас: Бьюсь об заклад. Фильтр с переключением на 10 корпусов примерно такой же медленный, как фильтр с переключением на 3 случая. - person R. Martinho Fernandes; 20.02.2011
comment
@Andreas: Просто присоединяюсь к тому, что здесь говорят другие. У меня был проект, в котором я заменил решение, основанное на отражении, на switch/case и получил ускорение более чем на порядок в нескольких узких циклах. Для более сложных сценариев также стоит попробовать делегата, обертывающего лямбду, которая просто извлекает свойство — они также могут превзойти отражение на порядок или больше. - person Daniel Pryden; 20.02.2011
comment
@Andreas: почти уверен, что переключение будет значительно быстрее. Переключатели преобразуются в набор последовательных операторов if, если количество случаев равно шести или меньше, если больше, то он преобразуется в статический словарь. - person Brent Rittenhouse; 14.06.2017