2017-12-15 12 views
4

私の究極の目標は、ラムダ式のネストされたプロパティを反復し、いずれかのプロパティがnullであるかどうかを判断することですが、表現。MemberExpressionからラムダ式を作成するにはどうすればいいですか

このダミーメソッドください:Compile.execラインで

public static void DoStuff<TModelDetail, TValue>(Expression<Func<TModelDetail, TValue>> expr, TModelDetail detail) 
{ 
    var memberExpression = expr.Body as MemberExpression; 
    if (memberExpression == null && expr.Body is UnaryExpression) 
    { 
     memberExpression = ((UnaryExpression)expr.Body).Operand as MemberExpression; 
    } 

    var pe = Expression.Parameter(typeof(TModelDetail), "x"); 
    var convert = Expression.Convert(memberExpression, typeof(object)); 
    var wee = Expression.Lambda<Func<TModelDetail, object>>(convert, pe); 
    var hey = wee.Compile()(detail);    
} 

を私は次のエラーを取得する:

ブラブラはTModelDetailのタイプである

variable 'x' of type 'Blah' referenced from scope '', but it is not defined

メンバーエクスプレッションでラムダを構築するにはどうすればよいですか?私が最終的にやりたいことは、ルートメンバー式を再帰的に探し出し、それがヌルかどうかを判断してバブルアップし、各後続メンバー式がヌルかどうかを判断することです。

+2

新しいパラメータを作成しないでください。ただし、これはメンバー式で使用されるため、 'expr'のパラメータを使用しないでください。現在、 'wee'は' x => y.Member'(yは 'expr'のパラメータです)のようなものですが、これは意味をなさないものです。 – ckuri

+0

@ckuriそうだね。私はそれを正しいものとしてマークすることができますので、これを答えとして入れてください。 – dtryan

+0

あなたの提案に従ってください。 – ckuri

答えて

3

exprには、すでにメンバ式でバインドされているパラメータ(yとします)が含まれています。expry => y.Member.Somethingのようになります。

あなたの構造の新しいラムダ式weeあなたはそれを新しいパラメータxを与えているが、そうweeは意味をなさないx => y.Member、のように見えます。

したがって、のパラメータをweeに再利用する必要があります。

関連する問題