8

List含まれているタイプが派生するすべてのDbSetを取得するにはどうすればよい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 { }
4

2 に答える 2

23

あなたはこのような何かをすることができます:

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)

于 2012-05-08T00:59:25.277 に答える
2

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];
    }
于 2012-05-08T00:52:35.983 に答える