C# 通过反射使用泛型类型调用动态Linq on方法
我有一个查询扩展程序,它有一个CustomExpression,我想用它对我的数据源进行一些过滤 这是在dynamicata网站中,所以我不知道编译时的对象类型(当前实体)。假设我在编译时知道对象类型,那么我可以这样做: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
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)
}