2014-04-23 23 views
1

我有一个程序,用户在其中输入想要更改的变量的名称。因此,我们有这样的:访问类似符号数组的C#类变量?

string user_input = "age"; 

而且我有以下类:

class Jim{ 
    public static int age = 10; 
    public static bool married = false; 
    public static string name = "John"; 
} 

我现在想打印变量的用户输入的值。因此,由于用户输入age我想打印Jim.age。我怎样才能将user_input转换成让我访问课程的东西。我真的想像你在JS中那样做Jim[input_string],但我相信这是可能的。

我会用字典来存储与Jim相关的所有变量,但是您不能制作Dictionary,它的地图为<string, bool or int or string>

+0

这真的不是你应该解决这个问题的方式。也许是某种绑定。但试图根据用户输入进行反映是非常危险的。 – Magus

+0

您可能需要考虑expando对象的这个http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx – milagvoniduak

+0

switch语句有什么问题? – Jonesopolis

回答

2

我会用字典来存储所有与吉姆相关的变量,但是你不能将一个字典映射为<string, bool or int or string>

当然可以,一个Dictionary<string, object>string,boolint都可以存储在类型为object的变量中。

0

正常的方式做,这是使用反射:

FieldInfo requestedField = typeof(Jim).GetField("age"); 
Console.WriteLine(requestedField.GetValue(instanceOfJim)); 

不幸的是,你不能这样做,因为你的变量是静态的。让他们成为实例成员,它会工作。正如评论者所指出的,允许用户进行反思并不是一个好主意,因此您可能需要重新思考一般用例。

你也可以使用映射到对象字典,作为Servy建议。再次

class Jim 
{ 
    ...Member variables... 
    public static GetMember(String name) 
    { 
     FieldInfo requestedField = typeof(Jim).GetField(name); 
     return requestedField.GetValue(null); 
    } 
} 

,不建议这样,但它会得到你想要的功能:

有趣的是,它可以与静态的工作,只要你把方法的吉姆类。

如果你想知道,在MSDN为FieldInfo.GetValue:MSDN