我有三个班级:Post
,Post<T>
和WallPost
。
Post是一个抽象类,表示包含name
,text
,user
等属性的博文。
第二个抽象类是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,没有提到任何一个包。
答案 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>>();