使用基 class 反映 IDbSet
Reflecting over IDbSets using base class
我有一个 DataContext
派生的 class,它有许多 IDbSet
是基础 class:[=18= 的子class ]
public class BaseClass
{
public int Id {get; set;}
public int Length {get; set;}
public int Height {get; set;}
}
public class Derived1 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived2 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived3 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived4 : BaseClass
{
public string SomeProperty {get; set}
}
public class MyContext : DbContext {
public IDbSet<Derived1> set1 {get; set;}
public IDbSet<Derived2> set2 {get; set;}
public IDbSet<Derived3> set3 {get; set;}
public IDbSet<Derived4> set4 {get; set;}
}
我实际上有更多派生的 classes 和相应的 IDbSet
s,我想在 MyContext class 上使用反射并迭代它们以检索和检查属性存在于基础 class 上,但是当我尝试将 IDbSet
转换为 IDbSet<BaseClass>
时,它返回 null。
using (var db = new ValidationDataContext())
{
try
{
Type t = db.GetType();
if (t != null)
{
foreach (PropertyInfo prop in t.GetProperties())
{
var objects = (t.InvokeMember(prop.Name, BindingFlags.GetProperty, null, db, null));
var dbset = objects as IDbSet<BaseClass>;
if (dbset != null) //dbset is always null
{
dbset.Where(v => v.Length <= 0)
.ForEach(v => Debug.WriteLine("Bad Length"));
}
}
}
}
}
有办法吗?
IDbSet<T>
不是协变接口,这意味着您不能将 IDbSet<Derived1>
变量分配给 IDbSet<BaseClass>
变量。更多关于协方差的信息:https://msdn.microsoft.com/en-us/library/dd799517%28v=vs.110%29.aspx
IDbSet<T>
实现了 IQueryable<T>
,它是一个协变接口,是 IDbSet<T>
的一部分,您要将其用于查询。
您可以尝试更换行:
var dbset = objects as IDbSet<BaseClass>;
和
var dbset = objects as IQueryable<BaseClass>;
您应该可以保留其余代码。
我有一个 DataContext
派生的 class,它有许多 IDbSet
是基础 class:[=18= 的子class ]
public class BaseClass
{
public int Id {get; set;}
public int Length {get; set;}
public int Height {get; set;}
}
public class Derived1 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived2 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived3 : BaseClass
{
public string SomeProperty {get; set}
}
public class Derived4 : BaseClass
{
public string SomeProperty {get; set}
}
public class MyContext : DbContext {
public IDbSet<Derived1> set1 {get; set;}
public IDbSet<Derived2> set2 {get; set;}
public IDbSet<Derived3> set3 {get; set;}
public IDbSet<Derived4> set4 {get; set;}
}
我实际上有更多派生的 classes 和相应的 IDbSet
s,我想在 MyContext class 上使用反射并迭代它们以检索和检查属性存在于基础 class 上,但是当我尝试将 IDbSet
转换为 IDbSet<BaseClass>
时,它返回 null。
using (var db = new ValidationDataContext())
{
try
{
Type t = db.GetType();
if (t != null)
{
foreach (PropertyInfo prop in t.GetProperties())
{
var objects = (t.InvokeMember(prop.Name, BindingFlags.GetProperty, null, db, null));
var dbset = objects as IDbSet<BaseClass>;
if (dbset != null) //dbset is always null
{
dbset.Where(v => v.Length <= 0)
.ForEach(v => Debug.WriteLine("Bad Length"));
}
}
}
}
}
有办法吗?
IDbSet<T>
不是协变接口,这意味着您不能将 IDbSet<Derived1>
变量分配给 IDbSet<BaseClass>
变量。更多关于协方差的信息:https://msdn.microsoft.com/en-us/library/dd799517%28v=vs.110%29.aspx
IDbSet<T>
实现了 IQueryable<T>
,它是一个协变接口,是 IDbSet<T>
的一部分,您要将其用于查询。
您可以尝试更换行:
var dbset = objects as IDbSet<BaseClass>;
和
var dbset = objects as IQueryable<BaseClass>;
您应该可以保留其余代码。