2009-08-11 62 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」,用枚舉你可以輕鬆地選出變量的名稱。