Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型列表_C#_Generics_.net 3.5 - Fatal编程技术网

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>() };