如何制作通用对象列表?

时间:2014-04-24 13:31:16

标签: c# generics

我遇到这种情况有困难:

我是这个通用类:

public class InformationsOlv<T> {
    private T _valeur;

    public String Nom { get; private set; }
    public DateTime TimeStamp { get; set; }

    ...
}

我想将InformationsOlv类型的任何对象存储在集合中。

所以我可以将它存储在一个对象列表中,但每次我想要获取有关该对象的信息时我都必须进行转换。

所以我想&#34;我应该创建一个抽象类并使InformationsOlv继承它并且#34;

所以我做了:

public abstract class AInformationsOlv {
    public String Nom;
    public DateTime TimeStamp;
}

并改变了InformationsOlv:

public class InformationsOlv<T>:AInformationsOlv {
    private readonly T _valeur;

    ...
}

如果我创建一个AInformationsOlv对象列表并在其中存储InformationsOlv对象,那就不错了。我可以从中访问Nom和TimeStamp变量(没有强制转换)但当然我无法访问_valeur我也不能将_valeur放在AInformationsOlv类中,因为它必须成为泛型类然后问题就会一样

有没有办法可以在抽象类中制作这样的东西:

public abstract class AInformationsOlv {
    public String Nom;
    public DateTime TimeStamp;
    protected ? _valeur;
}

在哪里?意思是:&#34;子类将包含一个_valeur类变量,我不知道该变量是什么类型,孩子将定义它&#34;。

谢谢

2 个答案:

答案 0 :(得分:2)

  

有没有办法可以定义一个类型为mans的成员“子类将包含一个_valeur类变量,我不知道该变量是什么类型,孩子们会定义它。”

当然 - 使用object作为类型:

protected object _valeur;

考虑一下 - 如果_valeur可以是不同的类型 - 你怎么知道你在编译时要处理的是什么类型?那么你如何使用呢?


List<T>为例 - 假设您需要List<List<?>>,其中内部列表可以是任何类型。现在您可以使用List<object>,甚至可以使用List<IEnumerable<object>>来保证内部列表至少是某种形式的IEnumerable<T>。但是我们假设您的语法存在:

var funkyList = new List<List<?>>();

我现在可以添加任何类型的列表:

funkyList.Add(new List<int>());
funkyList.Add(new List<Foo>());
funkyList.Add(new List<Bar>());

现在你提取一个内部List

List<?> l = funkyList[1];

但是?是什么?如果您不知道列表的类型是什么,您将如何使用它做任何有用的事情?充其量你必须使用反射(或dynamic)来获得内部类型,这会否定泛型的力量。

答案 1 :(得分:0)

如果你的子类要定义变量的类型,那么在编译时你无法在基类中访问它。那么为什么还要把它添加到那里呢?

您有两种选择,可以不在基类中添加,也可以将其定义为Object

public abstract class AInformationsOlv 
{
    public String Nom;
    public DateTime TimeStamp;
    protected object _valeur;
}