我有一个public
派生类,它有许多DataContext
s,它们是基类的子类:
IDbSet
我实际上有更多的派生类和相应的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;}
}
,我想在MyContext类上使用反射并迭代它们以检索和检查基类上存在的属性,但是当我尝试将IDbSet
转换为IDbSet
它返回null。
IDbSet<BaseClass>
有办法做到这一点吗?
答案 0 :(得分:1)
IDbSet<T>
不是协变接口,这意味着您无法将IDbSet<Derived1>
变量分配给IDbSet<BaseClass>
变量。有关协方差的更多信息,请访问:https://msdn.microsoft.com/en-us/library/dd799517%28v=vs.110%29.aspx
IDbSet<T>
实现了IQueryable<T>
,它是一个协变接口,是{\ n} IDbSet<T>
的一部分,用于查询。
您可以尝试替换该行:
var dbset = objects as IDbSet<BaseClass>;
与
var dbset = objects as IQueryable<BaseClass>;
您应该可以保留其余代码。