簡體   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