使用基类反映IDbSets

时间:2015-05-07 17:57:05

标签: c# reflection datacontext dbset

我有一个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>

有办法做到这一点吗?

1 个答案:

答案 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>;

您应该可以保留其余代码。