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

3
根据用户输入,我动态地组合了一个“Expression”。现在,我需要区分这个表达式是可写的还是不可写的。可写表达式的示例是引用具有setter的属性的属性表达式。非可写表达式的示例是对方法的调用。
当试图将值分配给不可写表达式时,“Expressions”库会引发一个“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 - Ian Mercer
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接