0

実行時まで不明な射影式の 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 をパラメーターにする必要があります。私が思いついた唯一の方法は、リフレクションを使用してメソッドを呼び出すことです。

4

1 に答える 1

1

パフォーマンスに問題がない場合は、変更する必要はありません。

あなたが持っているか、持っていると思うなら、あなたは見てみることができます

Fasterflect - 高速でシンプルな .NET リフレクション

http://fasterflect.codeplex.com/

于 2013-10-26T16:21:41.080 に答える