使用反射将 lambda 表达式作为参数传递

本文关键字:参数传递 表达式 lambda 反射 | 更新日期: 2023-09-27 17:55:50

我有一个通用的存储库方法调用,如下所示

var result = Repository<MyDbClass>.Get(x => x.MyProperty1 == "Something"
&& (!x.MyProperty2.HasValue || x.MyProperty2 == "SomethingElse"));

我希望使用反射来调用此方法。我主要在寻找一种使用反射将 lambda 表达式作为参数传递的方法。

编辑

实际上,我的存储库类型仅在运行时已知。所有这些存储库下的表都是相似的,有一些共同的列。正是在这些列上应用筛选器。所以我不能按原样传递表达式。

public void SomeMethod<T, TR>(T repository, TR dataObject)
{
    var type = repository.GetType();
    var dataType = dataObject.GetType();
    var getMethod = type.GetMethod("Get");
    //How to invoke the method by passing the lambda as parameter(??)
}

使用反射将 lambda 表达式作为参数传递

尝试传递Func<TR, bool>

var method = typeof(TR).GetMethod("Get");
if (method != null)
{
    method.Invoke(new Func<TR, bool>(
        (x) => x.MyProperty1 == "Something" /* etc... */));
}

通过假设您在Get方法中使用 LINQ 方法,您可以像这样填充 func

public IEnumerable<TR> Get<TR>(Func<TR, bool> func)
{
    return
        db.MyDbClassEntities.Where(func);
}