C# 泛型列表
我试图将泛型对象列表存储在泛型列表中,但在声明它时遇到了困难。我的对象看起来像:C# 泛型列表,c#,generics,.net-3.5,C#,Generics,.net 3.5,我试图将泛型对象列表存储在泛型列表中,但在声明它时遇到了困难。我的对象看起来像: public class Field<T> { public string Name { get; set; } public string Description { get; set; } public T Value { get; set; } /* ... */ } 公共类字段 { 公共字符串名称{get;set;} 公共字符串说明{get;s
public class Field<T>
{
public string Name { get; set; }
public string Description { get; set; }
public T Value { get; set; }
/*
...
*/
}
公共类字段
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共T值{get;set;}
/*
...
*/
}
我想创建一个列表。我的问题是列表中的每个对象都可以有一个单独的类型,因此填充的列表可能包含如下内容:
{ Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }
{Field,Field,Field,Field}
那么我该如何声明呢
List<Field<?>>
List在这种情况下,拥有包含非泛型位的抽象基类(或接口)可能会对您有所帮助:
public abstract class Field
{
public string Name { get; set; }
public string Description { get; set; }
}
public class Field<T> : Field
{
public T Value { get; set; }
/*
...
*/
}
公共抽象类字段
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
}
公共类字段:字段
{
公共T值{get;set;}
/*
...
*/
}
然后你可以有一个列表
。它表达了您实际知道的关于列表的所有信息。您不知道字段值的类型,因为它们可能因字段而异。也许可以实现一个接口
interface IField
{
}
class Field<T> : IField
{
}
接口i字段
{
}
类别字段:IField
{
}
List fields=new List(){new Field(),new Field()};
在编译时不知道泛型类型的情况下,不能声明泛型类型列表
您可以声明列表
或列表
,但是字段
和字段
没有比对象
更常见的基类型。因此,唯一可以容纳不同类型字段的List
就是List
如果希望列表具有更具体的类型,则必须使字段
类继承一个类或实现一个接口。然后,您可以将其用于列表中的泛型类型。@Jon-第一个类是泛型类还是简单类?@Giorgi,抽象类字段
看起来像是打字错误。我已经冒昧地更正了。他仍然需要施放才能得到实际的值类型。。。但这也是我能想到的唯一解决方案,没有实际的“tuple”类型。@tames,他处于更好的位置,因为他的列表元素必须从Field继承(在我的示例中,或者实现IField)。列表的类型仍然比列表的强objects@anthony... 我同意,并且我使用了接口和基类解决方案。这让他处于相同的位置,因为IField不包含类型(t)。与仅使用对象
没有太大区别,因为他仍然需要强制转换才能获得值。@tames,他处于更好的位置,因为他的列表元素必须实现IField(或继承自Field,在Jon的例子中)。列表的类型仍然比对象列表的强。@anthony。。。我同意,并且我已经使用了接口和基类解决方案。“尽可能保持类型安全”是一个有趣的想法,但是,您是否违反了这个概念?想想你将如何访问该列表,你真的需要它那么具体吗?
List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };