2017-03-13 10 views
2

사용자 입력에 따라 Expression을 동적으로 구성합니다. 이제이 표현식이 쓰기가 가능한 경우와 그렇지 않은 경우를 구별해야합니다. 쓰기 가능한 표현식의 예는 setter가있는 특성을 나타내는 특성 표현식입니다. 쓸 수없는 표현식은 예를 들어 메소드 호출입니다.표현식이 쓰기 가능한지 어떻게 알 수 있습니까?

쓰기 금지 식에 할당하려고하면 식 라이브러리에서 ArgumentExpression을 발생시킵니다. 그래서 현재, 나는 가지고있다 :

다양한 이유로 최대의 코드가 아니다. 누군가가 더 나은 방법을 알고 있는지 궁금합니다.

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.Parametertrue을 반환해야 함을 명시해야합니다 : 이안 머서에 의해 힌트를 바탕으로

+2

'Expression.Assign'의 소스 코드를 살펴보십시오. 'RequiresCanWrite'메소드가 표시됩니다. https://github.com/dotnet/corefx/blob/master/src/System.Linq.Expressions/src/System/Linq/Expressions/Expression.cs#L308을 참조하십시오. –

답변

0

, 내가 함께 종료했습니다.