Работает ли наследование в обобщениях так же, как конкретные и абстрактные классы, InvalidCaseException - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть три класса: 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)).и я установил параметр типа как 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>()

В любом случаеЯ полностью сбит с толку, и я надеюсь, что прояснился.

Заранее спасибо

E

PS Я использую NHibernate, и нет никаких упоминаний о сумке.

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Вы пытаетесь использовать общую ковариацию способом, который не является типобезопасным.

Что бы произошло, если бы вы написали

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

Вы можете делать только с интерфейсами только для чтения (IEnumerable<Post>) или массивами.

0 голосов
/ 12 декабря 2011

Для работы вы можете использовать:

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

и кастинг при его назначении:

bla.Posts = posts.Cast<Post<WallPost>>();
0 голосов
/ 28 апреля 2011

Вы должны проверить свои сопоставления NHibernate. NHibernate рассматривает вашу коллекцию как сумку, а не как список.

С точки зрения NHibernate, список не может быть подходящим выбором. Список предоставляет вам доступ на основе индекса к членам вашей коллекции, но вы должны иметь столбец индекса списка в своей таблице, чтобы NHibernate отобразил его как список.

Вам, вероятно, следует проверить параметры отображения коллекции NHibernate и выбрать тот, который лучше всего подходит для вашего случая (комплект, сумка, список и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...