我正在构建一个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
所以我这里有一个显然是编译器生成的类,没有自定义属性,因此没有CompilerGeneratedAttribute
!因此,当我打算do other stuff
时,我的代码将do stuff
。
如果有人能帮助我,我会非常感激。如果可能的话,我真的不想做任何与expressionType.Name
匹配<>.*__DisplayClass
之类的事情。
答案 0 :(得分:2)
根据Jon Skeet的答案,听起来像检查尖括号是否有效。
Where/what is the private variable in auto-implemented property?