2010-09-09 75 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来创建这个类。

相关问题