C# 泛型中的继承是否与具体类和抽象类的工作方式相同,InvalidCaseException

C# 泛型中的继承是否与具体类和抽象类的工作方式相同,InvalidCaseException,c#,.net,asp.net,nhibernate,generics,C#,.net,Asp.net,Nhibernate,Generics,我有三门课:Post,Post和WallPost Post是一个抽象类,表示博客文章,其属性包括名称、文本、用户等 第二个抽象类是Post,它是Post的通用版本,因此我可以实现一个通用的GetChildren(tpost),以获取Post的子级,并构建一个层次列表 第三类是具体的“WallPost”,它是用户配置文件的特定帖子 public class WallPost : Post<WallPost> (我使用泛型是因为我需要获取子项,GetChildren(T Post))。

我有三门课:
Post
Post
WallPost

Post是一个抽象类,表示博客文章,其属性包括
名称
文本
用户

第二个抽象类是
Post
,它是Post的通用版本,因此我可以实现一个通用的
GetChildren(tpost)
,以获取
Post
的子级,并构建一个层次列表

第三类是具体的“
WallPost
”,它是用户配置文件的特定帖子

public class WallPost : Post<WallPost>
(我使用泛型是因为我需要获取子项,
GetChildren(T Post)
)。我将type参数设置为Post,这样它将接受从Post、wallpost、blogpost等继承的任何类

现在我的问题是,我想将用户的
WallPosts
类型
IList
的集合传递给函数,我得到以下错误:

     Unable to cast object of type 'NHibernate.Collection.Generic.
PersistentGenericBag`1[BO.WallPost]'
 to type 'System.Collections.Generic.IList`1[BO.Post`1[BO.Post]]'.
我猜这是因为尽管你可以写一些像
Post p=new WallPost()
这样的东西,但你不能拥有
List posts=new List()

不管怎样,我完全困惑了,我希望我能把自己说清楚

先谢谢你

E


另外,我使用的是NHibernate,没有提到任何包。

您试图以一种不安全的方式使用通用协方差

如果你写信会发生什么

List<WallPost> wallList = new List<WallPost>();
List<Post> pList = wallList;
pList.Add(new OtherPost());        //Not a WallPost!
列表墙列表=新列表();
列表pList=墙列表;
pList.Add(新的OtherPost())//不是墙柱!

您只能使用只读接口(
IEnumerable
)或数组。

您需要检查NHibernate映射。NHibernate将您的收藏视为一个袋子,而不是一张清单

从NHibernate的角度来看,列表可能不是合适的选择。列表为您提供了对集合成员的基于索引的访问,但您的表中必须有一个列表索引列,以便NHibernate将其映射为列表


您可能应该查看NHibernate集合映射选项,并选择与您的案例最匹配的选项(集合、袋子、列表等)。

为了工作,您可以使用:

public IList<Post<WallPost>> Posts
{
    get; set;
}
公共IList帖子
{
获得;设置;
}
并在分配时进行转换:

bla.Posts = posts.Cast<Post<WallPost>>();
bla.Posts=Posts.Cast();

Man,您试图传递的集合显然不是IList。看看例外情况,它是NHibernate.Collection.Generic.PersistentGenericBag的一个可能的副本,我注意到,但在我的代码中没有提到包或任何东西,这都是IList问题是由于Nhibernate框架,我只能使用IList。好的,我将
WallPosts
转换为可枚举的“AsEnumerable”,并将控件中posts属性的数据类型更改为IEnumerable,并将错误“cannot implicitly convert type”System.Collections.Generic.IEnumerable改为“System.Collections.Generic.IEnumerable”@Eitan:A
WallPost
不是
Post
。是的,但WallPost继承了Post这真的让人困惑:)我在使用自动映射,所以我没有真正接触映射文件或任何东西。好吧,你需要检查你的映射设置。无论做什么,映射都是将您的收藏映射为一个包。
bla.Posts = posts.Cast<Post<WallPost>>();