C# - 带有通用数组的字典作为值

时间:2011-01-09 22:33:55

标签: c# .net generics dictionary

在我的班级中,我想使用带有以下声明的字典:

Dictionary<string, T[]>

由于我的类的操作对于所有泛型类型完全相同,我不希望将我的类定义为泛型(这意味着我必须为我插入到的每个泛型类型创建一个单独的类实例)字典?)。

我尝试的另一种方法是改为使用Dictionary<string, object>

public void Add<T>(string str, T value)
{
  // Assuming key already exists
  var array = (T[]) dictionary[str];
  array[0] = value;
}

但是,在迭代字典时,如何将对象值转换回数组?

foreach(string strKey in dictionary.Keys)
{
  var array = (T[]) dictionary[strKey];   // How to cast here ?
  //...
  array[0] = default(T);
}

感谢。

3 个答案:

答案 0 :(得分:2)

  

因为我班的操作是   所有通用类型都完全相同

您可以做的是定义接口中所有相同的方法,并使您的泛型类实现该接口。一旦你这样做,你需要做的就是创建一个字典,它将字符串作为键和InterfaceName类型的数组。这应该允许你有通用值(而不是object),你也不需要输入强制转换。

答案 1 :(得分:2)

你没有强制转换为T[],你使用System.Array,这是所有数组的基类。

var dictionary = new Dictionary<string, Array>();
foreach( var item in dictionary )
    item.Value.SetValue(null, 0);

您无需转换为特定数组类型即可执行的其他操作包括Array.ClearBuffer.BlockCopy

答案 2 :(得分:1)

您应该使用泛型类。如果从字典中检索的对象是类型安全的并且不需要强制转换,那么使用泛型类的优点是它已经是必需的类型。

你说“我的班级的操作对于所有泛型类型都是完全相同的” - 如果这意味着我认为它意味着那么它只是在你的案例中强化泛型类的有用性。