我正在我的应用中创建一个Settings对象,用于存储用户定义的设置等等。我打算为我的设置字段(整数,字符串,枚举,任何Serializable,真的)使用各种数据类型。
如果可能的话,我还想要一种类型安全的方法来设置任何设置。我提出的方法是做这样的事情:
Tuple<string, Type> SettingName = new Tuple<string, Type>("NumberOfFoos",
typeof(**TYPE**));
public void Set(Tuple<string, Type> key, **TYPE** value) { /* Stuff */ }
元组实际上是用户将值推送到的“设置”,并且将包含该设置的键以及该设置的类型。我想知道的是,如果有任何方法让编译器强制执行,Set()
方法中value
的类型与传递给{的元组中保存的类型对象的类型相同{1}}?我提议的方式是否可行?谢谢!
编辑:我想到了一些我应该澄清的事情。
1)这是一个静态类,因此我无法序列化整个类,只能序列化其中的成员。因此,我真的不想处理每个字段的序列化。我计划将所有设置值存储在Set()
中并序列化。
2)Dictionary<string, **TYPE**>
定义是恒定和静态的。我真的把它们视为一个typedef类型的东西(我真的应该创建自己的SettingKey结构),用户传递给Tuple
以指示它们正在改变的字段。 Type参数用于强制Set
参数具有指定类型。
答案 0 :(得分:2)
像
这样的东西public void Set<T>(Tuple<string,T> key, T value) { /* stuff */ }
可能会这样做
答案 1 :(得分: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)
来获取您传入的Type
对象。
答案 2 :(得分:2)
为什么不简单地在设置对象中添加强类型属性?例如public int NumberOfFoos {get {} set {...}}
并在getter和setter中调用您的常见序列化和反序列化代码。
如果你这样做,你的设置对象不会暴露它在内部如何工作,你有完整的智能感知支持。
答案 3 :(得分:0)
好吧,如果你做了Set<T>(Tuple<string, T>, T value)
这样的事情,那么你就可以得到你想要的东西。而且我认为编译器可以在使用中推断Set<T>()
中的T,因此您必须编写它。
但是你的Get<T>()
,你必须指定你希望得到的类型。
答案 4 :(得分: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");
}
}
你会更喜欢使用泛型,就像在其他答案中一样。
答案 5 :(得分: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来创建此类。