根据一些用户输入,我动态编写Expression
。现在,我需要区分这个表达式可写的情况和不表达的情况。可写表达式的示例是引用具有setter的属性的属性表达式。例如,不可写表达式就是对方法的调用。
当尝试分配给不可写表达式时,表达式库会引发ArgumentExpression
。所以目前,我有:
try
{
assign = Expression.Assign(prop2, prop1);
}
catch (ArgumentException)
{
...
}
由于各种原因不是最好的代码。我想知道是否有人知道更好的方式。
答案 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
。