Ich würde gerne prüfen, ob eine Eigenschaft vom Typ DbSet<T>
durch Reflexion.
public class Foo
{
public DbSet<Bar> Bars { get; set; }
}
Mit Hilfe der Reflexion:
var types = Assembly.GetExecutingAssembly().GetTypes();
foreach (var type in types)
{
if (type.IsSubclassOf(typeof (Foo)) || type.FullName == typeof (Foo).FullName)
{
foreach (
var prop in Type.GetType(type.FullName).
GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance))
{
var propType = prop.PropertyType;
bool a = propType.IsAssignableFrom(typeof (DbSet<>));
bool b = typeof (DbSet<>).IsAssignableFrom(propType);
bool c = propType.BaseType.IsAssignableFrom(typeof (DbSet<>));
bool d = typeof (DbSet<>).IsAssignableFrom(propType.BaseType);
bool e = typeof (DbSet<>).IsSubclassOf(propType);
bool f = typeof (DbSet<>).IsSubclassOf(propType.BaseType);
bool g = propType.IsSubclassOf(typeof (DbSet<>));
bool h = propType.BaseType.IsSubclassOf(typeof (DbSet<>));
bool i = propType.BaseType.Equals(typeof (DbSet<>));
bool j = typeof (DbSet<>).Equals(propType.BaseType);
bool k = propType.Name == typeof (DbSet<>).Name;
}
}
}
-
Gibt es eine kombinierte Lösung, um den Typ zu überprüfen? Wie Sie sehen können, verwende ich
IsSubClassOf
+FullName
um Klassen des TypsFoo
und jede andere Klasse, die sich vonFoo
. -
alle Prüfungen (a bis j) außer c,f,k geben false zurück. c,f geben System.Object als BaseType zurück, was für mich nicht von Nutzen ist. k halte ich für eine unsichere Kontrolle . Aber ich werde es verwenden, wenn keine andere Lösung gefunden wird. Im Debug-Modus wird die
propType
'sFullName
ist:System.Data.Entity.DbSet\`1\[\[Console1.Bar, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\]\]
Gibt es eine andere Möglichkeit zu prüfen, ob
propType
ist vom TypDbSet<>
?
Gracias.