如何调用接受linq表达式参数的方法

本文关键字:表达式 linq 参数 方法 何调用 调用 | 更新日期: 2023-09-27 18:18:06

嗨,这是我的方法,它作为通用实体框架存储库类的一部分存在。

public IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties)
        {
            List<T> list;
            IQueryable<T> dbQuery = Context.Set<T>();
            //Apply eager loading
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Include<T, object>(navigationProperty);
            list = dbQuery
            .AsNoTracking()
            .ToList<T>();
            return list;
        }

我需要通过反射来调用这个方法,这就是我到目前为止所做的。

using (var ctx = (DbContext)Activator.CreateInstance(dbContextType))
            {
                ctx.Configuration.LazyLoadingEnabled = false;
                var curEntityPI = ctx.GetType().GetProperties().Where(pr => pr.Name == "Worker").First();
                var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
                var set = ctx.Set(curEntityType);
                Type generic = typeof(DataAccess.Repository.EF.dEfDataRepository<,>);
                Type[] typeArgs = {curEntityType, dbContextType};
                Type constructed = generic.MakeGenericType(typeArgs);
                MethodInfo methodInfo = constructed.GetMethod("GetAll");
                object repositoryInstance = Activator.CreateInstance(constructed, new object[] { ctx });
                var result = methodInfo.Invoke(repositoryInstance,new object[] { });
            }

我知道我需要改变methodInfo中的参数数组。调用,但出于测试目的,说它只是一个空的linq表达式,或者在静态调用时与此等价。

WorkerRepository workerRepositoryInstance = new
WorkerRepository<Worker,MyDbContext>(ctx);
List<Worker> workers = workerRepositoryInstance.GetAll().ToList();

如何在methodInfo.Invoke()

中提供正确的参数?

我这样做是因为我需要与外部dll中的dbcontext和实体一起工作,并且不能在我的应用程序项目中添加对此的引用。我的应用程序需要能够以一种方式引用"附属"程序集,使应用程序的不同部署可以访问不同版本的数据提供程序dll。

非常感谢你的帮助

如何调用接受linq表达式参数的方法

如果我理解正确,您需要动态创建Expression<Func<T, object>>的空数组。

您可以使用Array.CreateInstance方法:

var navigationPropertyType = typeof(Expression<>).MakeGenericType(
    typeof(Func<,>).MakeGenericType(curEntityType, typeof(object)));
var navigationProperties = Array.CreateInstance(navigationPropertyType, 0);
var result = methodInfo.Invoke(repositoryInstance, new object[] { navigationProperties });