我想檢查一個屬性是否使用反射類型DbSet<T>
。C#使用反射的類型比較
public class Foo
{
public DbSet<Bar> Bars { get; set; }
}
通過使用反射:
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;
}
}
}
是否有合併的解決方案來檢查類型?正如您所看到的,我使用
IsSubClassOf
+FullName
來獲得類型Foo
的類和從Foo
派生的任何其他類。所有檢查(a到j)除c,f,k都返回false。 c,f返回System.Object作爲BaseType,這對我沒有用處。 k,我認爲不安全檢查。但如果沒有找到其他解決方法,我將會使用它。在調試模式下,
propType
的FullName
是:System.Data.Entity.DbSet`1[[Console1.Bar, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
是否有任何其他的方法來檢查,如果
propType
是DbSet<>
類型的?
謝謝。
你可以使用PropertyInfo.PropertyType這裏是一個鏈接到該MS http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.propertytype.aspx – MethodMan
@DJKRAZE:'PropertyInfo。 PropertyType'返回'System.Data.Entity.DbSet'1 [[Console1.Bar,...' – Kamyar