我正在按照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调试 session ,并找到了它(在“即时窗口”中运行):
expressionType.Name
"<>c__DisplayClass64"
expressionType.GetCustomAttributes(true)
{object[0]}
expressionType.GetCustomAttributes(true).Length
0

所以我这里是一个显然是编译器生成的类,没有自定义属性,因此没有CompilerGeneratedAttribute!因此,当我打算将其仅设置为do other stuff时,我的代码将设置为do stuff

如果有人可以在这里帮助我,我将非常感激。如果有可能,我真的不愿意做任何肮脏的事情,例如将expressionType.Name<>.*__DisplayClass之类的东西进行匹配。

最佳答案

根据乔恩·斯凯特(Jon Skeet)的回答,听起来好像可以检查尖括号了。

Where/what is the private variable in auto-implemented property?

关于c# - 在C#表达式树中可靠地检测编译器生成的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11008129/

10-10 13:39