2017-03-13 6 views
2

ユーザーの入力に基づいて、私はExpressionを動的に構成します。今、私はこの表現が書かれている場合とそうでない場合を区別する必要があります。書き込み可能な式の例は、セッターを持つプロパティを参照するプロパティ式です。書込み不可能な式は、たとえばメソッドの呼び出しです。式が書き込み可能かどうかはどのように調べることができますか?

書き込み不能式に代入しようとすると、式ライブラリによってArgumentExpressionが発生します。現在のところ、私は持っています:

try 
{ 
    assign = Expression.Assign(prop2, prop1); 
} 
catch (ArgumentException) 
{ 
    ... 
} 

さまざまな理由で最大のコードではありません。私は誰かがより良い方法を知っているのだろうかと思います。イアン・マーサーによってヒントをもとに、私が終わってきた

+2

'Expression.Assign'のソースコードを見てください。メソッド 'RequiresCanWrite'が表示されます。 https://github.com/dotnet/corefx/blob/master/src/System.Linq.Expressions/src/System/Linq/Expressions/Expression.cs#L308を参照してください。 –

答えて

0

private static bool IsWriteable(Expression expression) 
    { 
     switch (expression.NodeType) 
     { 
      case ExpressionType.Index: 
       PropertyInfo indexer = ((IndexExpression)expression).Indexer; 
       if (indexer == null || indexer.CanWrite) 
       { 
        return true; 
       } 
       break; 
      case ExpressionType.MemberAccess: 
       MemberInfo member = ((MemberExpression)expression).Member; 
       PropertyInfo prop = member as PropertyInfo; 
       if (prop != null) 
       { 
        if (prop.CanWrite) 
        { 
         return true; 
        } 
       } 
       else 
       { 
        Debug.Assert(member is FieldInfo); 
        FieldInfo field = (FieldInfo)member; 
        if (!(field.IsInitOnly || field.IsLiteral)) 
        { 
         return true; 
        } 
       } 
       break; 
     } 
     return false; 
    } 

case ExpressionType.Parameter一般にもtrueを返す必要があることを記載すべき。

関連する問題