我正在构建一个类似于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
! 因此,我的代码将执行其他操作,而我希望它只执行 stuff
。
如果有人能帮我解决这个问题,我将非常感激。 如果可能的话,我真的不想像匹配expressionType.Name
与 <>.*__DisplayClass
这样的东西一样做任何肮脏的事情。
() => x + 1 - y
转换为JavaScript表达式X + 1 - Y
,其中X和Y是C#名称x和y在JavaScript端的名称。现在,有时C#编译器会使用生成的类隐藏常量1
(好吧,这实际上发生在我身上的是bool类型,但这是小细节),我无法检查这些类。相反,我需要评估这些术语并发出JS以获取结果C# 值,而不是原始表达式。 - Rafe