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

标签 c# lambda casting expression

使用

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

关于C# 表达式转换为派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391210/

相关文章:

c# - 为什么C#中的SortedList没有Find方法?

c# - 今天、本周、本月流行——设计模式

c# - 关于“as”关键字的隐式/显式转换

c# - 如何在没有 DynamicInvoke 的情况下编译 MethodCallExpression?

ios - C# 规范是否允许从 ulong 转换为 int? Monotouch 给出一个 NumberOverflow

java - ClassCastException : Fragment cannot be cast to Fragment

java - 如果我已经拥有 key (作为字符串),则使用 AES 加密 Windows Phone 8 中的数据

c# - 异步方法导致应用程序崩溃

python - 用特殊字符过滤 df

haskell - 帮助理解 Haskell 中的这些语句