当调用.ToString()时,似乎LINQ表达式树不会将Enum值表示为完全限定。这是当前的代码:
BinaryExpression exp = stringsEqual; /* e.g. '(s1, s2) => s1 == s2' */
MethodInfo method =
typeof(string).GetMethod("Equals", new[] { typeof(string), typeof(StringComparison) });
ConstantExpression comparison =
Expression.Constant(StringComparison.OrdinalIgnoreCase, typeof (StringComparison));
MethodCallExpression caseInsensitiveEquals = Expression.Call(exp.Left, method, exp.Right, comparison);
Console.WriteLine(caseInsensitiveEquals); // will call .ToString()
(s1, s2) => s1.Equals(s2, OrdinalIgnoreCase)
(s1, s2) => s1.Equals(s2, StringComparison.OrdinalIgnoreCase)
此表达式本身可以执行,但如果通过表达式解析器运行,则该字符串不是有效表达式。
让Expression输出完全限定的枚举值有什么诀窍?
答案 0 :(得分:2)
查看ILSpy,Expression.ToString()
包含一行:
return ExpressionStringBuilder.ExpressionToString(this);
ExpressionStringBuilder
是一个密封的内部课程。如果你想破解它,那么就从ILSpy或其他来源获取它并按照你的意愿进行攻击。