Ste*_*ers 12 c# generics .net-3.5
我正在尝试将通用对象列表存储在通用列表中,但我很难声明它.我的对象看起来像:
public class Field<T>
{
public string Name { get; set; }
public string Description { get; set; }
public T Value { get; set; }
/*
...
*/
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个这样的列表.我的问题是列表中的每个对象都可以有一个单独的类型,因此填充的列表可能包含这样的内容:
{ Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }
Run Code Online (Sandbox Code Playgroud)
那么我该怎么宣布呢?
List<Field<?>>
Run Code Online (Sandbox Code Playgroud)
(我希望尽可能保持类型安全,所以我不想使用ArrayList).
Jon*_*eet 23
这种情况下,拥有包含非泛型位的抽象基类(或接口)可能会使您受益:
public abstract class Field
{
public string Name { get; set; }
public string Description { get; set; }
}
public class Field<T> : Field
{
public T Value { get; set; }
/*
...
*/
}
Run Code Online (Sandbox Code Playgroud)
那你就可以了List<Field>
.这表达了您对列表实际了解的所有信息.您不知道字段值的类型,因为它们可能因字段而异.
如果在编译时不知道泛型类型,则无法声明泛型类型列表.
你可以声明一个List<Field<int>>
或一个List<Field<double>>
,但没有其他常见的基本类型Field<int>
和Field<double>
比object
.所以唯一List<T>
可以容纳不同种类的领域的是List<object>
.
如果您希望列表具有更具体的类型,则必须使Field<T>
该类继承类或实现接口.然后,您可以将其用于列表中的泛型类型.
也许实现一个接口.
interface IField
{
}
class Field<T> : IField
{
}
Run Code Online (Sandbox Code Playgroud)
...
List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
Run Code Online (Sandbox Code Playgroud)