속성이 DbSet<T>
리플렉션을 사용하는지 확인하고 싶습니다.C# 리플렉션을 사용하여 유형 비교
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;
}
}
}
유형을 확인하는 통합 된 솔루션이 있습니까 : 사용하는 반사에 의해
public class Foo { public DbSet<Bar> Bars { get; set; } }
? 보시다시피
Foo
클래스와Foo
에서 파생 된 클래스를 가져 오려면IsSubClassOf
+FullName
을 사용하고 있습니다.c, f, k를 제외한 모든 검사 (a ~ j)는 false를 반환합니다. c, f System.Object를 BaseType으로 반환합니다.이 형식은 저에게 유용하지 않습니다. k, 나는 안전하지 않은 검사을 고려합니다. 그러나 다른 대안이 발견되지 않으면 내가 사용하는 것입니다. 디버그 모드에서
propType
의FullName
은 다음과 같습니다propType
유형DbSet<>
인 경우 확인하는 다른 방법은System.Data.Entity.DbSet`1[[Console1.Bar, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
있습니까?
감사합니다.
PropertyInfo.PropertyType을 사용할 수 있습니까? http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.propertytype.aspx – MethodMan
@DJKRAZE :'PropertyInfo. PropertyType'은'System.Data.Entity.DbSet'1 [[Console1.Bar, ...]' – Kamyar