c# - 通过反射使用泛型类型调用的方法上的动态 Linq

标签 c# linq reflection

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

这是在 DynamicData 网站上,所以我不知道编译时的对象类型(当前实体)。假设我在编译时知道对象类型,那么我可以这样做:

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);

这就是我用反射调用 cast 方法的方式,但我不知道如何在结果对象上调用 linq 方法。

最佳答案

如果您假设所有项目都具有该属性,则无需强制转换它们。

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

关于c# - 通过反射使用泛型类型调用的方法上的动态 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307784/

相关文章:

c# - 使用 IEnumerable<T> 作为方法的输入

c# - 通过 Roslyn 添加元数据引用时,将完整路径添加到项目文件中

c# - 根据键对字典列表进行排序

c# - 聚合 C# 数据集时,如何将 DataSet 转换为 .Load() 的 DataTable 数组?

C# sql命令无法搜索总成本

c# - 是否可以编写使用 xamarin 表单(UI)和 Unity(3D 部分)开发的非游戏跨平台 3D 可视化移动应用程序?

c# - 使用 Linq 读取第 n 层列表并将所需数据保存到另一个列表

reflection - 最佳实践 : What to use Reflection for?

android - 在 Lollipop 中启用或禁用移动数据

c# - 如何反射性地判断属性是否具有公共(public) Setter