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 stuff
、意図したときにdo stuff
.
誰かがここで私を助けてくれたら、とても感謝しています。expressionType.Name
可能であれば、 と を のように一致させるような下品なことはしたくありません<>.*__DisplayClass
。