我正在按照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/