2009-08-11 44 views
2

我有一个字符串用户设置,并希望我的C#的Windows应用程序的启动过程中选择具有相同名称的特定变量一个C#变量。如何选择使用字符串

例如

我有称为UserSelectedInt用户设置(字符串),这是目前设置为“MyTwo”。 (请注意,我的变量实际上有很多更复杂的类型不是整数,我只是把他们当作例子。)

public static int MyOne = 12345; 
public static int MyTwo = 54321; 
public static int MyThree = 33333; 

public int myInt = SelectMyVariableUsing(MyApp.Settings.Default.UserSelectedInt) 

用户可以选择“MyTwo”他们最后一次关闭的应用程序,从而使是我想在启动过程中选择的变量。我希望我有道理。

请让我知道我该如何做到这一点?

感谢

回答

23

使用Dictionary<string, int>。这允许您为多个字符串分配一个整数值。如果字符串是用户输入,则在尝试检索相应的整数之前,您需要检查它是否有效。

+0

更好的比我的awnser :) – 2009-08-11 09:58:25

+0

http://stackoverflow.com/questions/301371/why-dictionary-is-preferred-over-hashtable-in-c进一步阅读。 – 2009-08-11 09:58:27

+0

简单,理由必须考虑它^^ – Polo 2009-08-11 10:21:23

0

应该可以用反射

0

您也可以使用Hashtable

但是,从外观上看,您真正想要做的就是存储用户上次选择的值,因此我可能会将其保存在UserSettings中作为字符串,然后加载,我只会解析该值。

+0

如果您有权访问'Dictionary '(.NET 2.0+) – Thorarin 2009-08-11 10:03:53

+0

,请不要使用Hashtable。只是说这种类型的结构也可以。 – James 2009-08-11 11:09:03

0

我希望我读这一权利,但本质上,我觉得你要记住上次选择的值用户。由于应用程序将在此期间关闭,因此您将不得不将其存储在某处。也许在一个文件中。

2

听起来你正试图实现provider pattern。你可能会发现使用它是一个更好的机制供你使用,特别是你说它比使用整数更复杂。

在你的代码将使用MyApp.Settings.Default.UserSelectedInt设置引用特定的供应商。

我会建筑说,这会比其他一些建议答案的一个更好的机制。

2

最简单的方法可能就是使用GetField。

使用你的例子只是改变最后一行:

var selectedField = MyApp.Settings.Default.UserSelectedInt 
public int myInt = (int) GetType().GetField(selectedField).GetValue(this); 

如果该字段或​​类是静态的语法应为:

var selectedField = MyApp.Settings.Default.UserSelectedInt 
public int myInt = (int)typeof(YourClass).GetField(selectedField).GetValue(null); 

详情请参阅http://msdn.microsoft.com/en-us/library/system.reflection.fieldinfo.getvalue.aspx

+0

我不能得到这个编译 - 我在VS 2008中使用C#(.NET 3.5) - 这是不同版本的代码? 它告诉我'非静态字段,方法或属性object.GetType()'需要对象引用' – JamesW 2009-08-11 10:50:36

+0

这是使用反射。你需要用你的变量替换(int)。 – James 2009-08-11 11:11:34

+0

是的,我正在那样做 - 我很害怕没有快乐。我在一个静态类中,因此也不能使用'this'。这可能会影响事情吗? – JamesW 2009-08-11 11:18:00

2
// enumerate your list of property names (perhaps from a file) 
var settings = new List<string>(); 
settings.Add("MyOne"); 
settings.Add("MyTwo"); 
settings.Add("MyThree"); 

var settingMap = new Dictionary<string, int>(); 
int value = 0; 
foreach (var name in settings) 
{ 
    try 
    { 
     // try to parse the setting as an integer 
     if (Int32.TryParse((string)Properties.Settings.Default[name], out value)) 
     { 
      // add map property name to value if successful 
      settingMap.Add(name, value); 
     } 
     else 
     { 
      // alert if we were unable to parse the setting 
      Console.WriteLine(String.Format("The settings property \"{0}\" is not a valid type!", name)); 
     } 
    } 
    catch (SettingsPropertyNotFoundException ex) 
    { 
     // alert if the setting name could not be found 
     Console.WriteLine(ex.Message); 
    } 
} 

但是,如果你的阶段,你的变量列表是巨大的话,我也许会看实际访问属性直接通过某种形式的XML解析的文件。

+0

谢谢詹姆斯 - 非常感谢 – JamesW 2009-08-11 11:54:40

0

过我,这听起来更像是你应该在静态变量代替使用枚举,请看下面的例子:

public enum MyVars 
    { 
     MyOne = 12345, MyTwo = 54321, MyThree = 33333 
    } 
    static void Main(string[] args) 
    { 
     Console.WriteLine(String.Format("Name:{0}, Val={1}", MyVars.MyOne.ToString(), (int)MyVars.MyOne)); 
     Console.ReadKey(); 
    } 

,它将输出“姓名:MyOne,缬氨酸= 12345”,用枚举你可以轻松地选出变量的名称。