可靠地检测 C# 表达式树中编译器生成的类

本文关键字:编译器 检测 表达式 | 更新日期: 2023-09-27 18:36:55

我正在按照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 stuff时,我的代码会do other stuff

如果有人能在这里帮助我,我将不胜感激。 如果可能的话,我真的宁愿不做任何肮脏的事情,比如将expressionType.Name<>.*__DisplayClass之类的东西相匹配。

可靠地检测 C# 表达式树中编译器生成的类

根据Jon Skeet在这里的回答,听起来检查尖括号会起作用。

自动实现的属性中的私有变量在哪里/是什么?