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.Parameter
도 true
을 반환해야 함을 명시해야합니다 : 이안 머서에 의해 힌트를 바탕으로
'Expression.Assign'의 소스 코드를 살펴보십시오. 'RequiresCanWrite'메소드가 표시됩니다. https://github.com/dotnet/corefx/blob/master/src/System.Linq.Expressions/src/System/Linq/Expressions/Expression.cs#L308을 참조하십시오. –