通过反射以泛型类型调用的动态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方法。
如果您假设所有项都具有该属性,则不需要对它们进行强制类型转换。
protected void GameFiltering(object sender, CustomExpressionEventArgs e)
{
e.Query = e.Query.Where(obj => (int)obj.GetType().GetProperty("GameId").GetValue(obj, null) == GameId)
}