未知(子类)类型的通用集合

时间:2019-02-07 07:10:57

标签: c# generics reflection

我有一个从接口派生的基本抽象类(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,但通常以'..是变量,但像类型一样使用'结束, 我实际上认为不可能,但是欢迎任何反馈

0 个答案:

没有答案