2016-05-27 8 views
2

(Ich verwende EF6 hier) Sagen, ich habe eine abstrakte Klasse:Wie iteriert man über alle DbSet in einem generischen?

public abstract class MyContext<T> : DbContext 

und lasst es in Gebrauch genommen:

public class MyTestContext : MyContext<MyTestContext> 
{ 
    public DbSet<Object1> Object1 { get; set; } 
    public DbSet<Object2> Object2 { get; set; } 
} 

Nun, sage ich alles über die DbSets iterieren wollen in MyTestContext, in meiner abstrakten Klasse. Scheint dies funktionieren würde (dies ist in einem Verfahren in meiner abstrakten Klasse):

var dbSetProperties = typeof(T).GetProperties().Where(p => p.PropertyType == typeof(DbSet<>)); 

Doch komme ich „Aufzählung keine Treffer“.

Was mache ich hier falsch? Vielen Dank!

bearbeiten Hinweis - Ich erwarte nicht zu wissen, die generischen Typ Argumente im Vorfeld - Ich bin eigentlich auf der Suche nach bestimmen, welche Typen in jedem der DbSets sind.

+1

Eigenschaften sind nicht vom Typ DbSet <>, ihre generische Definition ist. –

Antwort

4

So ein Foo<T> ist nicht vom Typ Foo<>. Sie müssen die generische Typdefinition Ihrer Foo<T> s erhalten und diese vergleichen.

var dbSetProperties = typeof(MyTestContext) 
    .GetProperties() 
    .Where(p => p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)); 
+0

Ha, scheint im Nachhinein so offensichtlich. Danke, das hat es getan. Ich gebe dir die Antwort in ... ah .. 6 Minuten :) – John