2010-09-09 69 views
1

我在我的應用程序中創建一個Settings對象,用於存儲用戶定義的設置和whatnot。我打算使用各種數據類型來設置我的設置字段(int,字符串,枚舉,真正的Serializable)。「存儲」一個類型參數供以後在C#中使用?

如果可能的話,我還想用類型安全的方法來設置任何設置。我提出的方法會做這樣的事情:

Tuple<string, Type> SettingName = new Tuple<string, Type>("NumberOfFoos", 
                  typeof(**TYPE**)); 
public void Set(Tuple<string, Type> key, **TYPE** value) { /* Stuff */ } 

元組將有效地將其「設置」,用戶將推動一個值,而將包括該設置的鍵以及類型該設置。我想知道的是,如果有什麼辦法讓編譯器強制執行,在Set()方法中,value的類型與保存在傳遞給Set()的元組中的類型對象類型相同?我提出的方式甚至可能嗎?謝謝!

編輯:我想到了更多的東西,我應該澄清。

1)這是一個靜態類,所以我不能序列化整個類,只有它的成員。因此,我真的很想不必爲每個字段處理序列化。我打算將所有設置值存儲在Dictionary<string, **TYPE**>中並對其進行序列化。

2)Tuple定義意味着是恆定的和靜態的。我真的把它們視爲更多的typedef類型的東西(我真的應該做我自己的SettingKey結構),用戶傳遞到Set表明他們正在改變的領域。 Type參數是爲了強制value參數是指定的類型。

回答

2

喜歡的東西

public void Set<T>(Tuple<string,T> key, T value) { /* stuff */ } 

可能做到這一點

+0

其實,這樣做的結果很好,謝謝! – 2010-09-09 18:48:45

0

好吧,如果你不喜歡的東西Set<T>(Tuple<string, T>, T value),你會得到你的設置後,在做什麼。我認爲編譯器可以在使用時推斷出Set<T>()中的T,所以你必須編寫它。

但是您的Get<T>(),您必須指定您希望找回的類型。

2

這是更好地擺脫了元組,並使用一個通用的方法:

public void Set<T>(string key, T value); 

這樣的話,你可以在編譯時指定類型

Set<string>("MyStringKey", "foo"); 
Set<int>("MyIntKey", 1); 

或編譯器可以推斷它爲您提供:

Set("MyStringKey", "foo"); 
Set("MyIntKey", 1); 

Set,您可以使用typeof(T)通用電氣t時的Type對象,你會在已經過去了。

+0

但事情是,我想強制執行的值參數是我在元組中指定的類型。 – 2010-09-09 18:03:19

+0

但你不需要元組,編譯器可以在沒有它的情況下自動計算出類型,這取決於'value'參數的類型 – thecoop 2010-09-09 20:03:38

0
public class Foo 
{ 
    Tuple<string, Type> SettingName = new Tuple<string, Type>("NumberOfFoos", 
                  typeof(**TYPE**)); 
    public void Set(Tuple<string, Type> key, object value) 
    { 
    if(value.GetType() != SettingsName.Value) 
     throw new ArgumentException("value"); 
    } 
} 

你會使用泛型像,雖然其他的答案更好。

2

爲什麼不簡單地向設置對象添加強類型屬性?例如public int NumberOfFoos {get {} set {...}}並在getter和setter中調用您的常見序列化和反序列化代碼。

如果您這樣做,您的設置對象不會公開其內部工作方式,並且您對其具有完整的智能感知支持。

+0

那麼,我也想避免擁有一個私有的numberOfFoos字段和一個單獨的NumberOfFoos屬性,爲我的每個60左右的設置領域。我打算使用Dictionary來存儲基於密鑰的所有設置。在檢索值時我必須進行投射,但這就是爲什麼我想要使用這樣的類型。 – 2010-09-09 17:59:08

+0

你可以讓它們成爲所有自動屬性,例如'public int NumberOfFoos {get; set;}'add for serialization,你可以在類中添加一個'[DataContract]',爲每個屬性添加一個'[DataMember]'屬性,使得它成爲一個單行程序來將整個設置類序列化爲XML或JSON等。總體來說更清潔。 – 2010-09-10 19:12:50

0

我認爲你根本不需要處理Type。這樣的事情會不夠好嗎?

class Settings { 
    public static int Foo { 
    get { return (int)_map["Foo"]; } 
    set { _map["Foo"] = value; } 
    } 
    public static string Bar { 
    get { return (string)_map["Foo"]; } 
    set { _map["Foo"] = value; } 
    } 
    // ... 
    private static Dictionary<string, object> _map = 
    new Dictionary<string, object>(); 
} 

然後你會序列化字典。你甚至可以使用一些code-generation來創建這個類。

相關問題