如何声明包含泛型类型的数组?

des*_*lsj 6 c# generics

说我有以下类型:

public class Field<T>
{
  public string Name { get; set; }
  public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何声明包含此类字段数组的变量?我尝试了以下方法:

var customFields = new Field[]
{
    new Field<string> { Name = "nickname", Value = "Bob" },
    new Field<int> { Name = "age", Value = 42 },
    new Field<DateTime> { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};
Run Code Online (Sandbox Code Playgroud)

但我得到以下编译时异常:

使用泛型类型"Field"需要1个类型参数

我也试过,var customFields = new Field<object>[]但我得到以下错误:

无法隐式将"Field"类型转换为"Field"

无法隐式将"Field"类型转换为"Field"

无法隐式将"Field"类型转换为"Field"

Gil*_*een 14

正如Matias所说,不能这样做,因为Field<int>并且Field<string>是完全不同的类型.你能做的是:

创建一个Field非通用的基础:

public class Field
{
    public string Name { get; set; }
}

public class Field<T> : Field
{
    public T Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后:

var customFields = new Field[]
{
    new Field<string> { Name = "nickname", Value = "Bob" },
    new Field<int> { Name = "age", Value = 42 },
    new Field<DateTime> { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};
Run Code Online (Sandbox Code Playgroud)

正如马蒂亚斯评论的那样,需要一个向下倾斜才能获得Value不同类型.如果对于每种不同类型的Value特定逻辑要执行,处理它的一种好方法是使用Factory设计模式.工厂将返回每个Field正确的" FieldHandler<T>",它将向下,执行操作并返回所需的内容.

  • 仅供参考:您必须向下转换为泛型类型才能获得元素的"Value"属性. (5认同)