Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过反射使用泛型类型调用动态Linq on方法_C#_Linq_Reflection - Fatal编程技术网

C# 通过反射使用泛型类型调用动态Linq on方法

C# 通过反射使用泛型类型调用动态Linq on方法,c#,linq,reflection,C#,Linq,Reflection,我有一个查询扩展程序,它有一个CustomExpression,我想用它对我的数据源进行一些过滤 这是在dynamicata网站中,所以我不知道编译时的对象类型(当前实体)。假设我在编译时知道对象类型,那么我可以这样做: protected void GameFiltering(object sender, CustomExpressionEventArgs e) { e.Query = e.Query.Cast<Resource>().Where(x => x

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

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

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

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

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

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

您是否尝试过使用。上面链接中答案的可能副本包含如何通过反射调用正确的
Where
重载的说明。基本上,您必须遍历
System.Linq.Enumerable
上定义的所有现有
Where
方法,并搜索合适的方法。然后构建一个
Func
作为参数传递。如果所有类型都有一个属性
GameID
,为什么不实现一个公共接口并强制转换为该属性呢。然后您可以在该实例上调用
Where
,因为它们是通过实体框架从数据库自动生成的。有趣的解决方案。我试过这样做:e.Query=e.Query.Cast().Where(x=>(短)x.GetType().GetProperty(“GameId”).GetValue(x,null)==GameId);仍然必须转换到一些东西,否则我不能调用e.Query上的Where。这是可行的,但是当我尝试在gridview上执行DataBind()时,我得到一个错误,它应该是Resource类型的QueryObject,但是它得到了ObjectObject类型的QueryObject什么类型是
e.Query
?{System.Data.Entity.Core.Objects.ObjectQuery}
protected void GameFiltering(object sender, CustomExpressionEventArgs e)
{
    e.Query = e.Query.Where(obj => (int)obj.GetType().GetProperty("GameId").GetValue(obj, null) == GameId)
}