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

我正在建立一个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 ...
    }
}

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

expressionType.Name
"<>c__displayClass64"
expressionType.GetCustomAttributes(true)
{object[0]}
expressionType.GetCustomAttributes(true).Length
0

所以我在这里一个明显的编译器生成的类没有自定义属性,因此没有编译器生成属性!因此,我的代码将做其他的事情,当我打算做只是做的东西.

如果有人能帮助我,我会非常感谢.如果在所有可能的情况下,我真的不会做任何肮脏的东西,像匹配的expressionType.Name与类似<>.* __ displayClass.

解决方法

根据Jon Skeet的回答,这听起来像是检查尖括号会起作用.

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...