Родовые коллекции неизвестных (подкласс) типов - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть базовый абстрактный класс (baseEntity), полученный из интерфейса.Из этого у меня есть много подклассов - каждый фактически представляет таблицу базы данных для NHibernate.Некоторые подклассы содержат свойства, которые являются другими baseEntity классами, а некоторые содержат свойства, которые являются списками других baseEntity классов.Для некоторых из этих свойств списка я преобразовал использование ILIst/List в ISet/HashSet, чтобы остановить исключение NHIbernate, замеченное после обновления с древней версии

Невозможно одновременно получить несколько пакетов

Мой вопрос не связан с NHIbernate :

public interface INhEntity;

public abstract class BaseEntity;

public class OrderItems : baseEntity
{
    // properties
}

public class Order : baseEntity
{
    public virtual ISet<OrderItems> OrderItems { get; set;}
    public Order()
    {
        OrderItems = new HashSet<OrderItems>();
    }
}

Мы используем ISet/HashSet, потому что это казалось простым и безопасным способом избавиться от проблемы с несколькими сумками (HashSet тихо остановит дубликаты)

Мы также используем обмен сообщениями для отправки данных между сайтами.По сути, каждый baseEntity сериализуется.С другой стороны, мы десериализовываем, используем PropertyInfo, вводим детали типа и т. Д. Для восстановления подкласса baseEntity. Что касается классов Order/OrderItem, приведенных выше, мне нужно создать / получить доступ / получить доступ к свойству OrderItem.Вот где приходит веселье:

Когда я обрабатываю свойство Set, я пытаюсь получить доступ, как показано ниже:

private void ProcessSet(object entity, ListItem listItem, PropertyInfo property)
{
    //entity is an instance of the Order entity
    //listitem contains info I will use to update the order item
    //property is the OrderItems property. It has a vale of:
    //ISet`1[Full.NameSpace.OrderItem] OrderItem}

    var setInstance = GetOrCreateSetInstance(entity, property);
    ...processing
    setInstance.Add(AnOrderItemInstance); //NHibernate knows to link the 2 database tables (OrderItems class does not need/have a FK)
}

private static ISet<baseEntity> GetOrCreateSetInstance(object entity, PropertyInfo prop)
{
    var listInstance = prop.GetValue(entity, null); // This looks just what I want
    var result = (ISet<baseEntity>)listINstance //cannot cast type OrderItem to baseEntity
    return result
}

У меня есть похожий код для работы со списками.Поскольку я могу вернуть неуниверсальный Ilist, это работает.До обновления NHibernate я использовал Iesi Isets, поэтому у моей GetOrCreateINstance была такая подпись:

private static Iesi.Collection.ISet GetOrCreateSetInstance(object entity, PropertyInfo prop)

Есть ли у меня способ вернуть различные экземпляры подкласса?Примечание. Я попытался вернуть HashSet<baseEntity>, Iset/HashSet<INhEntity>

. Я пробовал приведение к разным методам, но обычно получаю «переменная, но она используется как тип», на самом деле я этого не делаю.думаю, что это возможно, но любые отзывы приветствуются

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