C# 理解泛型与继承类的结合

C# 理解泛型与继承类的结合,c#,abstract-class,generics,C#,Abstract Class,Generics,这是一个与NHibernate有关的问题,但我开始认为我的问题可能远比这更基本 由于与NHibernate-相关的原因,我有一个基本抽象类(Listing)和从中继承的类(Listing_UK,Listing_US),等等)。 这些功能相同。 我理解为什么这不起作用: List<Listing> test = new List<Listing_UK>(); 从我在这里得到的反应来看,我有理由相信我所要求的是不可能的 代码中不需要使用“as”。这很好: List<L

这是一个与NHibernate有关的问题,但我开始认为我的问题可能远比这更基本

由于与
NHibernate
-相关的原因,我有一个基本抽象类(
Listing
)和从中继承的类(
Listing_UK
Listing_US
),等等)。
这些功能相同。
我理解为什么这不起作用:

List<Listing> test = new List<Listing_UK>();
从我在这里得到的反应来看,我有理由相信我所要求的是不可能的

代码中不需要使用“as”。这很好:

List<Listing> test = new List<Listing>();
test.Add(new Listing_UK());
List test=newlist();
test.Add(新列表_UK());
现在还不清楚你需要做什么,而你已经做不到了。您真的需要
列表吗?这里的大局是什么?如果你能展示一些不起作用的代码,那会有帮助

编辑:好的,现在您已经解释了更多,我怀疑您想要一个通用方法:

List<Listing> list = condition ? QueryList<Listing_UK>() 
                               : QueryList<Listing_US>();

private static List<Listing> QueryList<T>() where T : Listing
{
    return DBSession.QueryOver<T>()
                    .Where(l => l.Field == "value")
                    .List<Listing>();
}
List=条件?QueryList()
:QueryList();
私有静态列表QueryList(),其中T:Listing
{
返回DBSession.QueryOver()
.其中(l=>l.字段==“值”)
.List();
}
我不太了解NHibernate,不知道这是否足够,但如果不够,我相信你可以稍微调整一下


您最初的想法是尝试以可交换的方式处理类型,但实际上是行不通的。

如果列表继承了抽象类列表,则在将其添加到列表中时不需要进行任何强制转换。像这样的沮丧是隐含的

List<Listing> test = new List<Listing>();
test.Add(new Listing_UK());
简单

class Foo:Bar{}
class Foo : Bar { }

void Test(List<Bar> list);
无效试验(列表);
记住,你可以做到:

List<Bar> list = new List<Bar>();
Test (list);
List List=新列表();
测试(列表);
但你不能:

List<Foo> list = new List<Foo>();
Test (list);
List List=新列表();
测试(列表);
要实现这一目标,请使用:

void Test2 <T> (List<T> list) where T : Bar    
void Test2(列表),其中T:Bar

List List=新列表();
测试(list.Cast().ToList());//不是托利斯

那是因为

Bar is Bar; // true
Foo is Bar; // true
List<Foo> is List<Foo>; // true
List<Bar> is List<Bar>; // true
Bar就是Bar;//真的
Foo是Bar;//真的
列表就是列表;//真的
列表就是列表;//真的
但是

List是List;//假的!

第二个示例有什么问题?(显然演员阵容是不必要的。)如果你展示我在Jon Skeet的评论中发布的
Listing_UK
的代码,可能会有所帮助。。。我想我已经过度简化了这个例子。我联系到的问题有点涵盖了它,尽管它非常具体。它有一个QueryOver对象,我希望它能够作为QueryOver和QueryOver互换使用。我想我是在要求不可能的事情,不过……哦,那是你的问题吗?你应该说得更清楚,哈哈。在这种情况下,我下面的答案不是很有用。什么是
List()
?可能是
ToList()
?是的,对不起,我用“as”来演示我要实现的目标。我的大局在相关问题中有所概述,尽管它非常具体。基本上,它有一个QueryOver对象,我希望能够在QueryOver和QueryOver之间自由切换。不过,我怀疑我想要的是不可能的——从纯编程的角度来看,使用单独的类使我的数据最终出现在不同的表中有点疯狂……按照您所描述的方式,我想我希望将
test
作为
List
,然后使用
test.OfType()
test.OfType()
,等,视需要而定。但我真的不明白你在说什么。@Alastair:不,你不能在他们之间自由切换。。。你说你知道为什么
List test=newlist()不起作用-这就是为什么你不能在它们之间自由切换的原因。但是你需要用它们做什么呢?我已经编辑了原始问题-我的例子中显然太抽象了…好的,谢谢。这绝对是我需要朝的方向,这是有道理的。把它作为答案!
List<Foo> list = new List<Foo>();
Test (list);
void Test2 <T> (List<T> list) where T : Bar    
List<Foo> list = new List<Foo>();
Test (list.Cast<Bar>().ToList()); // not ToList<Bar>()
Bar is Bar; // true
Foo is Bar; // true
List<Foo> is List<Foo>; // true
List<Bar> is List<Bar>; // true
List<Foo> is List<Bar>; // false!