我有一个从接口派生的基本抽象类(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
,Type details等来重构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>
我尝试了多种方法进行Casting,但通常以'..是变量,但像类型一样使用'结束, 我实际上认为不可能,但是欢迎任何反馈