在C#中通过名称获取变量

13

有没有一种方法可以仅通过知道变量的名称来获取其值,就像这样:

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

当我通常会像这样访问变量

double temp = MyClass.VariableName;

1
我很好奇你需要在什么情况下这样做,因为通常访问属性值就足够了。 - Corey Sunwold
1个回答

31

你可以使用反射。例如,如果PropertyNameMyClass上的一个公共属性,并且你有该类的一个实例,那么你可以:

MyClass myClassInstance = ...
double temp = (double)typeof(MyClass).GetProperty("PropertyName").GetValue(myClassInstance, null);
如果它是一个公共的字段: field
MyClass myClassInstance = ...
double temp = (double)typeof(MyClass).GetField("FieldName").GetValue(myClassInstance);

当然,你应该意识到反射并非免费。与直接访问属性/字段相比,可能会有性能损失。


2
请注意:频繁使用可能会非常缓慢。 - Emond
反射机制比一个包含10个case的switch过滤器慢吗? - Andreas
@Andeas,我一点头绪也没有,我打赌反射会更慢,但最好的方法是测量它以确保你在将代码投入生产之前要确定 - Darin Dimitrov
2
@Andreas:我敢打赌。一个有10个case的switch过滤器和一个有3个case的switch过滤器一样慢。 - R. Martinho Fernandes
@Andreas:只是附和其他人在这里所说的话。我曾经有一个项目,在其中将基于反射的解决方案替换为switch/case,并在几个紧密循环中获得了超过一个数量级的加速。对于更复杂的情况,还值得尝试委托包装一个仅获取属性的lambda表达式--这些也可以超越反射一个数量级或更多。 - Daniel Pryden
@Andreas:我很确定使用 switch 会更快。如果 case 的数量小于等于六个,switch 语句会被转换成一堆顺序执行的 if 语句;如果 case 的数量大于六个,它会被转换成一个静态字典。 - Brent Rittenhouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接