0

我有一个DataContext派生类,它有许多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;}
}

我实际上有更多的派生类和相应IDbSet的 s,我想在 MyContext 类上使用反射并遍历它们以检索和检查基类上存在的属性,但是当我尝试强制转换时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"));
                        }
                    }
                }
            }
        }

有没有办法做到这一点?

4

1 回答 1

1

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

您应该能够保持其余代码不变。

于 2015-05-07T21:11:15.837 回答