“存储”一个类型参数供以后在C#中使用?

时间:2010-09-09 17:36:55

标签: c# generics parameters types

我正在我的应用中创建一个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参数具有指定类型。

6 个答案:

答案 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来创建此类。