我有一个 DataProvider 类,它有一个带有 Ef 的上下文派生对象的 Context 属性。
public class DataProvider
{
private CargoDbContext Context { get; }
...
因此,通过这个 Context 我可以访问表、记录数等:
var carsCount = Context.Cars.Count();
我想在 DataProvider 中创建一个通用方法来找出记录的数量,如下所示:
var data = new DataProvider();
var carsCount = data.FetchCount<Cars>();
我写了以下实现:
public int FetchCount<T>()
{
string tableName = typeof(T).Name;
var efTable = Context.GetType().GetProperty(tableName);
var countMethod = efTable.GetType().GetMethod("Count");
return (int)countMethod.Invoke(efTable, null);
}
我是这样想的:在 EF 中,根据数据库中表的名称存在实体类。ef上下文具有与实体类同名的属性,而这些属性是DbSet的本质,从中可以请求Count()方法。
因此,我为方法指定了一个类型,将类型名称作为字符串获取,并在上下文中获取具有该名称的属性。这将是 DbSet。在它上面,我得到 Count 方法并调用这个方法,将这个相同的 DbSet 作为实例传递。一切似乎都很顺利:在 efTable 中确实有一个 DbSet 类型的值,但这里的 countMethod 顽固地保持为空。我也尝试像这样调用 .GetMethod("Count", BindingFlags.Public | BindingFlags.Instance) ,但它没有帮助。
你如何最终做到这一点?
使用@4per 的链接,我针对我的问题调整了他的解决方案,并最终采用了以下方法:
UPD。事实证明,您可以更轻松地做到这一点,而无需反思:
此外,事实证明,它在已经涉及多种方法的更复杂的片段中特别方便: