繁体   English   中英

C#表达式转换为派生类型

[英]C# Expression Casting as Derived Type

运用

IQueryable<T> query - where T : BaseEntity

我有以下代码,在泛型方法中使用 - 使用反射来调用.Where()方法(这是有效的):

var predicate = Expression.Lambda(body, item);
MethodInfo whereCall = (typeof(Queryable).GetMethods().First(mi => mi.Name == "Where" && mi.GetParameters().Length == 2).MakeGenericMethod(query.ElementType));
MethodCallExpression call = Expression.Call(whereCall, new Expression[] { query.Expression, predicate });

query = query.Provider.CreateQuery<T>(call);

我想使用这样的东西(并避免反射):

var predicate = Expression.Lambda<Func<T, bool>>(body, item);
query = query.Where(predicate);

但是这段代码的问题是T被用作基类型,而不是运行时的派生类型。

如何将T转换为query.ElementType(派生类型)?

你的第二段代码确实比第一段更好。 您需要以某种方式使用反射调用Expression.Lambda方法。 一个方便的方法是:

static IQueryable<T> CreateQuery<T>(IQueryable<T> query, ...) {
  var predicate = Expression.Lambda<Func<T, bool>>(body, item);
  query = query.Where(predicate);
  return query;
}

使用T作为派生类型调用此方法。 您可以使用MakeGenericMethod执行该调用。 根据您的情况,可能足以说:

CreateQuery((dynamic)query);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM