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

时间:2011-04-28 12:04:52

标签: c# .net asp.net nhibernate generics

我有三个班级:PostPost<T>WallPost

Post是一个抽象类,表示包含nametextuser等属性的博文。

第二个抽象类是Post<T>,post的通用版本,因此我可以实现通用GetChildren(T Post)来获取post的子项并构建一个层级列表。

第三类是具体的“WallPost”,它是用户个人资料的特定帖子。

public class WallPost : Post<WallPost>

最后是一个Member类,其中包含WallPosts

的集合

我编写了一个控件,它收集了一些帖子并将其显示在树中。我对这种控制的一个原则是

public IList<Post<Post>> Posts
        {
            get; set;
        }

(我使用泛型,因为我需要让孩子,GetChildren(T Post))。并将type参数设置为Post,因此它将接受从post,wallpost,blogpost等继承的任何类

现在我的问题是我想将用户的WallPosts类型IList<WallPost>集合传递给该函数,我收到此错误:

     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<Post> posts = new List<WallPost>()

无论如何,我完全不知所措,我希望自己能说清楚。

提前谢谢

电子

P.S。我使用的是NHibernate,没有提到任何一个包。

3 个答案:

答案 0 :(得分:1)

您尝试以非类型安全的方式使用通用协方差。

如果你写

会发生什么
List<WallPost> wallList = new List<WallPost>();
List<Post> pList = wallList;
pList.Add(new OtherPost());        //Not a WallPost!

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

答案 1 :(得分:0)

您需要检查您的NHibernate映射。 NHibernate将您的收藏视为一个包而不是列表。

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

您应该查看NHibernate集合映射选项,并选择最适合您的情况(集合,包,列表等)。

答案 2 :(得分:0)

为了工作,你可以使用:

public IList<Post<WallPost>> Posts
{
    get; set;
}

并在分配时进行投射:

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