プロパティが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;
}
}
}
は型をチェックするマージされた解決策はありますか?ご覧のとおり、
Foo
のクラスとFoo
から派生したクラスのクラスを取得するには、IsSubClassOf
+FullName
を使用しています。c、f、kを除くすべてのチェック(a〜j)は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を使用できますか?http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.propertytype.aspx – MethodMan
@DJKRAZE: 'PropertyInfo。 PropertyType'は 'System.Data.Entity.DbSet'1 [[Console1.Bar、...]' – Kamyar