第一个 - 这是一个示例,不是针对您的特定问题的解决方案。
我的实体类
using System;
using System.Collections.Generic;
using System.Text;
namespace MyIdentityModel
{
public class IdentityRole
{
public long Id { get; set; }
public string Name { get; set; } = null!;
public DateTimeOffset CreatedAt { get; set; }
public bool Active { get; set; }
public bool Enabled { get; set; }
public DateTimeOffset ActiveUntil { get; set; }
}
}
我的背景
using MyIdentityModel.Configuration;
using Microsoft.EntityFrameworkCore;
using System;
namespace MyIdentityModel
{
public abstract class IdentityDbContextBase: DbContext
{
public IdentityDbContextBase(DbContextOptions options) : base(options)
{
}
public DbSet<IdentityRole> Roles { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new IdentityRoleConfiguration());
}
}
}
示例解决方案
我有3种方法
public List<TResult> GetList<TResult>(DbContext context, string entityTypeName)
where TResult : class
{
Type entityType = Type.GetType(entityTypeName); // get type of entity / MyIdentityModel.IdentityRole
var setMethod = context.GetType().GetMethod(nameof(DbContext.Set), new Type[] { }).MakeGenericMethod(entityType); //Get Method Set<MyIdentityModel.IdentityRole>
var dbSet = setMethod.Invoke(context, new object[] { }); // Calling context.Set<MyIdentityModel.IdentityRole>
/* Call to another methods using reflection before calling "ToList"
Eg. example Where, Include, Select
*/
var toListMethod = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(entityType); //get Extension Method "ToList<MyIdentityModel.IdentityRole>"
var list = (List<TResult>)toListMethod.Invoke(null, new object[] { dbSet });//Calling "context.Set<MyIdentityModel.IdentityRole>.ToList<MyIdentityModel.IdentityRole>()" Method and convert to destination type if is possible.
return list;
}
public List<TEntity> GetList2<TEntity>(DbContext context)
where TEntity : class
{
var setMethod = context.GetType().GetMethod(nameof(DbContext.Set), new Type[] { }).MakeGenericMethod(typeof(TEntity)); //Get Method Set<MyIdentityModel.IdentityRole>
var dbSet = setMethod.Invoke(context, new object[] { }); // Calling context.Set<MyIdentityModel.IdentityRole>
/* Call to another methods using reflection before calling "ToList"
Eg. example Where, Include, Select
*/
var toListMethod = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(typeof(TEntity)); //get Extension Method "ToList<MyIdentityModel.IdentityRole>"
var list = (List<TEntity>)toListMethod.Invoke(null, new object[] { dbSet });//Calling "context.Set<MyIdentityModel.IdentityRole>.ToList<MyIdentityModel.IdentityRole>()" Method and convert to destination type if is possible.
return list;
}
public List<TEntity> GetList3<TEntity>(DbContext context)
where TEntity : class
{
return context.Set<TEntity>()/* Call to another methods before "ToList" */.ToList();
}
主程序调用。
- 您需要上下文,AssemblyQualifiedName = 参数。结果的类型名称 = 类型参数。
public List<TResult> GetList<TResult>(DbContext context, string entityTypeName)
- 您需要上下文 = 参数。结果的类型名称 = 类型参数。
public List<TEntity> GetList2<TEntity>(DbContext context)
- 您需要上下文 = 参数。结果的类型名称 = 类型参数。
public List<TEntity> GetList3<TEntity>(DbContext context)
Console.WriteLine("█ Result 1");
var result = GetList<MyIdentityModel.IdentityRole>(context, typeof(MyIdentityModel.IdentityRole).AssemblyQualifiedName);
Console.WriteLine(JsonSerializer.Serialize(result));
Console.WriteLine();
Console.Write("█ Result 2");
var result2 = GetList2<MyIdentityModel.IdentityRole>(context);
Console.WriteLine(JsonSerializer.Serialize(result2));
Console.WriteLine();
Console.Write("█ Result 3");
var result3 = GetList3<MyIdentityModel.IdentityRole>(context);
Console.WriteLine(JsonSerializer.Serialize(result3));
Console.WriteLine();