[英]How to declare an array containing generic type?
说我有以下类型:
public class Field<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
如何声明包含此类字段数组的变量? 我尝试了以下方法:
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) }
};
但我得到以下编译时异常:
使用泛型类型“Field”需要1个类型参数
我也尝试了var customFields = new Field<object>[]
但是我收到以下错误:
无法隐式将“Field”类型转换为“Field”
无法隐式将“Field”类型转换为“Field”
无法隐式将“Field”类型转换为“Field”
正如Matias所说,不能这样做,因为Field<int>
和Field<string>
是完全不同的类型。 你能做的是:
创建一个非泛型的基本Field
:
public class Field
{
public string Name { get; set; }
}
public class Field<T> : Field
{
public T Value { get; set; }
}
接着:
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) }
};
正如马蒂亚斯评论的那样,需要一个向下转型才能获得不同类型的Value
。 如果对于每种不同类型的Value
都有一个特定的逻辑要执行,处理它的一个好方法是使用Factory
设计模式。 工厂将为每个Field
返回一个正确的“ FieldHandler<T>
”,它将向下转换,执行操作并返回所需的内容。
您可以做的另一件事是简单地为所有这些类型使用公共基类 - 对象。
class Field
{
public string Name { get; set; }
public Object Value { get; set; }
}
var customFields = new Field[]
{
new Field { Name = "nickname ", Value = "Bob" },
new Field { Name = "age", Value = 42 },
new Field { Name = "customer_since", Value = new DateTime(2000, 12, 1) }
};
但是,这会将某些类型处理卸载到customFields的使用者,但如果已知与特定字段名称关联的Value类型,则应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.