[英]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.