実行時まで不明な射影式の TResult を提供するために、リフレクションを使用してメソッドを呼び出す状況があります。TResult は式ノードに文字列として含まれており、Type.GetType() で取得します。その Type を取得したら、ExpressionNode を、queryable.Select() が理解できる Expression にキャストし直すことができます。これはすべて完全に機能しますが、メソッドのジェネリック型としてパラメーターを渡すタスクを達成するために、リフレクション以外の方法があるかどうか疑問に思います。
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 経由でサーバーに送信された後、クライアントで生成された式を使用して person のデータ ソースをクエリできるように、expressionNode を Expression> にキャストする必要があります。式ノード内の文字列から戻り値の型を判別できます。使用する dto によって戻り値の型が変わるため、キャストの設定ができません。
Func<Person, PersonWithBlogPostsDto>>
事前に。つまり、PersonWithBlogPostDto をパラメーターにする必要があります。私が思いついた唯一の方法は、リフレクションを使用してメソッドを呼び出すことです。