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

Raf*_*afe 11 .net c# linq expression-trees linq-expressions

我正在构建一个C#表达式到Javascript的转换器,沿着Linq-to-SQL的路线,但我遇到了编译器生成的表达式树的问题.

我遇到的特殊问题是处理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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我打开了一个Visual Studio调试会话,我发现它(在立即窗口中运行):

expressionType.Name
"<>c__DisplayClass64"
expressionType.GetCustomAttributes(true)
{object[0]}
expressionType.GetCustomAttributes(true).Length
0
Run Code Online (Sandbox Code Playgroud)

所以我在这里有一个显然是编译器生成的类,没有自定义属性,因此没有CompilerGeneratedAttribute!因此,do other stuff当我打算公正时,我的代码将会do stuff.

如果有人能帮助我,我会非常感激.如果可能的话,我真的宁愿做任何肮脏的事情就像匹配类似的expressionType.Name东西<>.*__DisplayClass.

Jam*_*ing 4

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

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