12

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

4

1 に答える 1

4

ここでのJonSkeetの回答に基づくと、アングルブラケットのチェックは機能するようです。

自動実装プロパティのプライベート変数はどこ/何ですか?

于 2012-06-13T11:39:04.027 に答える