我正在按照 Linq-to-SQL 的方式构建一个 C# 表达式到 Javascript 转换器,但是我遇到了编译器生成的表达式树的问题。
我遇到的特殊问题是处理MemberExpression
编译器生成的值,但CompilerGeneratedAttribute
它们的类型没有指定。
这是我一直在尝试的精简版:
void ProcessMemberExpression(MemberExpression memberX) {
var expression = memberX.Expression;
var expressionType = expression.Type;
var customAttributes = expressionType.GetCustomAttributes(true);
var expressionTypeIsCompilerGenerated = customAttributes.Any(x => x is CompilerGeneratedAttribute);
if (expressionTypeIsCompilerGenerated) {
var memberExpressionValue = Expression.Lambda(memberX).Compile().DynamicInvoke();
... do stuff ...
}
else {
... do other stuff ...
}
}
现在,我打开了一个 Visual Studio 调试会话,我发现它(在即时窗口中运行):
expressionType.Name
"<>c__DisplayClass64"
expressionType.GetCustomAttributes(true)
{object[0]}
expressionType.GetCustomAttributes(true).Length
0
所以我这里有一个明显的编译器生成的类,没有自定义属性,因此没有CompilerGeneratedAttribute
!因此,我的代码do other stuff
将do stuff
.
如果有人可以在这里帮助我,我将不胜感激。如果可能的话,我真的宁愿不做任何肮脏的expressionType.Name
事情,比如将<>.*__DisplayClass
.