【问题标题】:How can I find all DbSets whose generic types derive from a given base type?如何找到泛型类型派生自给定基类型的所有 DbSet?
【发布时间】:2012-05-08 00:17:59
【问题描述】:

如何获得所有 DbSets 的 List,其中包含的类型派生自 IncomingServiceOrderBase

我可以使用反射来获取所有 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 { }

【问题讨论】:

    标签: c# entity-framework generics reflection entity-framework-4.1


    【解决方案1】:

    你可以这样做:

    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)

    【讨论】:

      【解决方案2】:

      typeof(BaseType).IsAssignableFrom(DerivedType)。它将返回真/假。见http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

      要将DbSet&lt;T&gt; 转换为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];
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-08
        • 2014-03-22
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多