12

我正在按照 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 stuffdo stuff.

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

4

1 回答 1

4

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

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

于 2012-06-13T11:39:04.027 回答