如何判断表达式是否可写?

时间:2017-03-13 21:10:06

标签: c# linq-expressions

根据一些用户输入,我动态编写Expression。现在,我需要区分这个表达式可写的情况和不表达的情况。可写表达式的示例是引用具有setter的属性的属性表达式。例如,不可写表达式就是对方法的调用。

当尝试分配给不可写表达式时,表达式库会引发ArgumentExpression。所以目前,我有:

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

由于各种原因不是最好的代码。我想知道是否有人知道更好的方式。

1 个答案:

答案 0 :(得分:0)

根据Ian Mercer的提示,我最终得到了:

    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