gpt4 book ai didi

c# - 如何确定表达式是否可写?

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:21 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

根据 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

关于c# - 如何确定表达式是否可写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com