繁体   English   中英

generics 中的 inheritance 是否与具体和抽象类的工作方式相同,InvalidCaseException

[英]Does inheritance in generics work the same way as concrete and abstract classes, InvalidCaseException

我有三个类: PostPost<T>WallPost

Post 是一个抽象的 class 表示具有nametextuser等属性的博客文章。

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

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

public class WallPost : Post<WallPost>

最后是一个包含 WallPosts 集合的Member WallPosts


我编写了一个控件,它接收一组帖子并将其显示在树中。 我对该控件的属性之一是

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

(我使用 generics 因为我需要带孩子GetChildren(T Post) )。 我将类型参数设置为 Post,因此它将接受任何继承自 post、wallpost、blogpost 等的 class

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

     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>()

无论如何,我完全感到困惑,我希望我说清楚了。

先感谢您

PS 我使用 NHibernate 并没有提到任何包。

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

如果你写会发生什么

List<WallPost> wallList = new List<WallPost>();
List<Post> pList = wallList;
pList.Add(new OtherPost());        //Not a WallPost!

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

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

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

您可能应该查看 NHibernate 集合映射选项并选择最匹配您的情况的一个(集合、包、列表等)。

为了工作,您可以使用:

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

并在分配时进行转换:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM