У меня есть базовый абстрактный класс (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>
. Я пробовал приведение к разным методам, но обычно получаю «переменная, но она используется как тип», на самом деле я этого не делаю.думаю, что это возможно, но любые отзывы приветствуются