我有一种情况,我使用反射来调用一个方法,以便提供一个投影表达式的 TResult,该表达式在运行时是未知的。TResult 作为字符串包含在表达式节点中,我使用 Type.GetType() 检索它。一旦我有了那个类型,我就可以将 ExpressionNode 转换回一个 queryable.Select() 可以理解的表达式。虽然所有这一切都完美无缺,但我想知道除了反射之外是否还有其他方法可以完成将参数作为方法的泛型类型传递的任务。
public static string ProcessExpressionNode<TSource>(this IQueryable<TSource> sourceQuery, ExpressionNode expressionNode)
{
var destType = Type.GetType(expressionNode.Type.GenericArguments[1].Name);
var result = typeof(QueryableExtensions).GetMethod("ExecuteExpression", BindingFlags.Static | BindingFlags.NonPublic)
.MakeGenericMethod(destType, typeof(TSource))
.Invoke(null, new object[] { expressionNode, sourceQuery });
return JsonConvert.SerializeObject(result);
}
internal static List<TResult> ExecuteExpression<TResult, TSource>(ExpressionNode expressionNode, IQueryable<TSource> source)
{
var result = source.Select(expressionNode.ToExpression<Func<TSource,TResult>>());
return result.ToList();
}
-更新 1:好的,在服务器上我有一个表达式
Expression<Func<Person, PersonWithBlogPostsDto>> expression1 = person => new PersonWithBlogPostsDto
{
DisplayName = person.FirstName,
Key = person.Key,
Posts = person.Blog.Posts
};
那被序列化了
var serializedExpression = expression1.ToExpressionNode();
在通过 wcf 传输到服务器后,我需要将 expressionNode 转换回 Expression> 以便我可以使用客户端生成的表达式查询 person 的数据源。我可以从表达式节点中的字符串确定返回类型。返回类型将根据所使用的 dto 而改变,因此我无法设置
Func<Person, PersonWithBlogPostsDto>>
提前时间。换句话说,我需要 PersonWithBlogPostDto 作为参数。我能够想出的唯一方法是使用反射来调用该方法。