我遇到这种情况有困难:
我是这个通用类:
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;。
谢谢
答案 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;
}