初始化键值具有泛型类型

时间:2018-02-01 10:50:43

标签: c# generics

我需要一组键值元组,其值具有泛型类型。我不想将值声明为System.Object。期望的用法是这样的:

Pair[] pairs = new Pair[]
{
  new Pair<int> { Name = "Age", Value = 44 },
  new Pair<string> { Name = "FirstName", Value = "Frank" },
};

Pair定义如下:

public class Pair<T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

在声明和初始化pairs

时,会出现以下编译错误
  

使用通用类型&#39; Pair&lt; T&gt;&#39;需要1个类型参数

如果我要更改这样的代码:

Pair<int>[] pairs = new Pair<int>[]
{
   new Pair<int> { Name = "Age", Value = 44 },
   new Pair<string> { Name = "FirstName", Value = "Frank" },
};

显然会满足Pair<int>而不是Pair<string>

  

无法隐式转换类型&#39; Pair&lt; string&gt;&#39;到&#39;配对&lt; int&gt;&#39;

如果我要更改这样的代码:

Pair<object>[] pairs = new Pair<object>[]
{
    new Pair<int> { Name = "Age", Value = 44 },
    new Pair<string> { Name = "FirstName", Value = "Frank" },
};

然后编译错误是(两次):

  

无法隐式转换类型&#39; Pair&lt; int&gt;&#39;到&#39;配对&lt; object&gt;&#39;

---更新

我不想将Pair.Value声明为对象的原因是我想要定义特殊对,如下所示:

public class AgePair : Pair<int> { }

public class NamePair : Pair<string> { }

1 个答案:

答案 0 :(得分:1)

虽然Pair<int>Pair<string>共享Pair<T>的类定义,但它们在运行时被编译为完全不同的类型。那么,你不能把它们放在IEnumerable<T>T[]类型中。你根本就不能这样做(直接)。

如果您允许类Pair<T>继承自将类型对象作为Type对象返回的类Pair,则可以使用IEnumerable<Pair>Pair[]并使用对象分别检查typeof(Value)

这是非常不干净的,并且根据其类型而不是它的定义更改结果的实现,这违反了OOP原则并增加了隐藏的复杂性。这正是Key-Value存储通常以字符串字符串或字符串对象的形式完成的原因,其中对象属于在复杂(多个属性和方法)类中定义的类型。