如何使用反射从DbContext获取DbSet<SomeClass>(EF)?

3

假设我有

DBContext principal = new DBContext();
var x = principal.GetType().GetProperty("SomeClass").GetType();

我现在有DbSet< SomeClass >的PropertyInfo。

我现在想做的是以某种方式迭代(例如转换为列表)并获取表中每行的值。

想象一下,我可以这样做:

x[0] // would be the 0th entery in DbSet<SomeClass>, the first row aka of type SomeClass

从这里开始,我将知道如何进一步深入并访问属性(使用与上述相同的原则)


2
这听起来像是一个 XY 问题。为什么你不使用泛型,例如 DbContext.Set<T>() 方法,而要使用反射呢? - CodeCaster
因为我正在尝试创建自己的自定义ValidationAttribute,在构造函数中,我将Type类作为参数发送。如果它是一个函数,我会使用泛型,但我不能编写类似public Constructor<T>这样的内容。 - Ilhan
2
使用 DBContext.Set<T> 吗?我已经有一段时间没有用 EF 了,但我相信它有一种通用的方式可以接受一个类型。 - Jeroen Vannevel
你确定要在属性内部访问数据库吗? - CodeCaster
var myName = principal.set<MyClass>().ToList()[0].FirstName; ConsoleWriteline(x); 理论上应该可以工作,但由于某些原因我陷入了一个无限循环中 @JeroenVannevel - Ilhan
数据库出了点问题。我确认你的评论是答案,能否请你发布一下,这样我就可以点赞了。非常感谢你的帮助 @JeroenVannevel - Ilhan
1个回答

6

DbSet实现了IEnumerableIEnumerable<T>,因此可以这样使用:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace efAW
{
    class Program
    {

        static IEnumerable GetAllMembers(DbContext db, string dbSetName)
        {
            var pi = db.GetType().GetProperty(dbSetName);
            return (IEnumerable)pi.GetValue(db);
        }
        static void Main(string[] args)
        {
            using (var db = new aw())
            {
                var customers = GetAllMembers(db, "Customers").OfType<Customer>().ToList();
            }
        }
    }
}

大卫


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接