如何将字符串值转换为对象属性名称

22

这是我第一次在C#/.NET中做这样的事情,它让我想起了JavaScript中可以使用eval()函数或动态编写脚本和生成HTML所能轻松完成的事情。我有一个来自用户输入的字符串,例如string input = "foo"。现在我想以这个值"foo"作为我拥有的对象(如cover)的属性名:

string input = "foo";
//magic to convert string value to be used
//as a object property name goes here maybe...
var success = cover.foo;

在C#中有没有一种方法可以做到这一点?可能使用反射?我已经尝试过了,但总是得到一个并不能真正解决我的问题的对象。


2
可以使用.Net反射来实现这一点。http://www.codeproject.com/Articles/19911/Dynamically-Invoke-A-Method-Given-Strings-with-Met - Tony
1
大致上是 var success = cover.GetType().GetProperty(input).GetValue(cover),虽然你可能想要接受预期返回类型的 GetProperty 版本等等,而且你也应该小心异常和错误情况。 - Rup
3
可以使用反射/动态对象实现,但也许更有用的是尝试理解您想要做什么——可能存在其他替代方案。 - Charleh
1
我建议使用switch case语句。反射可能听起来是正确的工具,但请记住这是很昂贵的。此外,您确定要使用从用户输入中获取的字符串来获取对象的属性吗?如果他输入了“fooo”而不是“foo”,会怎样呢? - Ovidiu
你想在运行时更改属性名称吗? - terrybozzio
不太对,我想在运行时更改指定属性的值。 - LaRae White
1个回答

32

反思是正确的工具:

PropertyInfo pinfo = typeof(YourType).GetProperty("YourProperty");
object value = pinfo.GetValue(YourInstantiatedObject, null);

5
谢谢,这个方法是有效的,而且与上面评论中建议的方法类似,只需要稍微修改一下:var success = cover.GetType().GetProperty(input).GetValue(cover, null); - LaRae White

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