通过反射以泛型类型调用的动态Linq方法

本文关键字:动态 Linq 方法 调用 泛型类型 反射 | 更新日期: 2023-09-27 18:10:26

我有一个查询扩展器,它有一个CustomExpression,我想用它来对我的数据源进行一些过滤。

这是在一个动态数据网站,所以我不知道对象类型(当前实体)在编译时。假设我在编译时知道对象类型,那么我可以这样做:

protected void GameFiltering(object sender, CustomExpressionEventArgs e)
{
        e.Query = e.Query.Cast<Resource>().Where(x => x.GameId == GameId);
}

我可以从e.Query.ElementType得到我需要的类型。现在我只需要将ElementType作为泛型参数发送给Cast方法,然后调用linq方法Where。

我假设每个Type都有一个GameId属性,我想通过它来过滤。

MethodInfo method = e.Query.GetType().GetMethod("Cast").MakeGenericMethod(new Type[] { e.Query.ElementType });
var castedQuery = method.Invoke(e.Query, null);

这就是我如何调用带有反射的强制转换方法,但我不知道如何在结果对象上调用linq方法。

通过反射以泛型类型调用的动态Linq方法

如果您假设所有项都具有该属性,则不需要对它们进行强制类型转换。

protected void GameFiltering(object sender, CustomExpressionEventArgs e)
{
    e.Query = e.Query.Where(obj => (int)obj.GetType().GetProperty("GameId").GetValue(obj, null) == GameId)
}