[英]“Store” a type parameter for later use in C#?
我正在應用程序中創建一個Settings對象,用於存儲用戶定義的設置等。 我計划在我的設置字段中使用各種數據類型(int,字符串,枚舉,任何可序列化的東西)。
如果可能的話,我還想使用一種類型安全的方式來設置任何設置。 我建議的方法將執行以下操作:
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
參數為指定類型。
就像是
public void Set<T>(Tuple<string,T> key, T value) { /* stuff */ }
可能會做到
最好刪除元組,並使用通用方法:
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)
來獲取要傳遞的Type
對象。
為什么不簡單地將強類型屬性添加到您的設置對象? 例如public int NumberOfFoos {get {} set {...}}
並在getter和setter中調用您的通用序列化和反序列化代碼。
如果這樣做,您的設置對象將無法公開其內部工作方式,並且您將獲得全面的智能感知支持。
好吧,如果您執行了諸如Set<T>(Tuple<string, T>, T value)
類的操作,則將獲得設置所需的內容。 而且我認為編譯器可以在使用時推斷Set<T>()
中的Set<T>()
,因此您必須編寫它。
但是,您的Get<T>()
,您必須指定期望返回的類型。
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");
}
}
不過,最好像其他答案一樣使用泛型。
我認為您根本不需要處理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>();
}
然后,您將序列化字典。 您甚至可以使用一些代碼生成來創建此類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.