繁体   English   中英

如何找到其泛型类型派生自给定基类型的所有DbSet?

[英]How can I find all DbSets whose generic types derive from a given base type?

如何获取包含类型从IncomingServiceOrderBase派生的所有DbSet的List

我可以使用反射来获取所有DbSet,但是如何将其过滤到包含派生类型的那些?

上下文

public class MyContext : DbContext
{
    public DbSet<BuildingOrder> BuildingOrders { get; set; }
    public DbSet<DeliveryOrder> DeliveryOrders { get; set; }
    public DbSet<RetailAssemblyOrder> RetailAssemblyOrders { get; set; }
}

模型

public class BuildingOrder : IncomingManufacturedProductOrderBase { }
public class DeliveryOrder : IncomingServiceOrderBase { }
public class RetailAssemblyOrder : IncomingServiceOrderBase { }

你可以这样做:

var sets =
    from p in typeof(MyContext).GetProperties()
    where p.PropertyType.IsGenericType
    && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)
    let entityType = p.PropertyType.GetGenericArguments().First()
    where typeof(IncomingServiceOrderBase).IsAssignableFrom(entityType)
    select p.Name;

(这将返回属性的名称;如果您需要实际的DbSet实例,请将p.Name替换为p.GetValue(context, null)

typeof(BaseType).IsAssignableFrom(DerivedType) 它会返回true / false。 请参阅http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

要将DbSet<T>转换为T (这样您可以进行此比较),请采用每个属性的类型并执行以下操作:

    public static Type GetGenericBaseType( this Type Type ) {
        if ( Type == null ) {
            throw new ArgumentNullException( "Type" );
        }
        if ( !Type.IsGenericType ) {
            throw new ArgumentOutOfRangeException( "Type", Type.FullName + " isn't Generic" );
        }
        Type[] args = Type.GetGenericArguments();
        if ( args.Length != 1 ) {
            throw new ArgumentOutOfRangeException( "Type", Type.FullName + " isn't a Generic type with one argument -- e.g. T<U>" );
        }
        return args[0];
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM