7

は、どのように私は含まれているタイプがIncomingServiceOrderBaseから派生すべてDbSetsのListを得ることができますか?ジェネリック型が特定の基本型から派生したすべてのDbSetsを検索するにはどうすればよいですか?

私はすべてのDbSetsを取得するためにリフレクションを使用することができますが、どのように私は、派生型が含まれているものだけにそれを絞り込むのですか?

コンテキスト

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 { } 

答えて

18

あなたはこのようsomehingを行うことができます。

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.GetValue(context, null)p.Nameを置き換える)

2

typeof(BaseType).IsAssignableFrom(DerivedType)。真/偽を返します。各プロパティの型を取ると、このような何かを(あなたがこの比較を行うことができます)TDbSet<T>を有効にするにはhttp://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

を参照してください:

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]; 
    } 
関連する問題