Подтвердить что ты не робот

Надежное обнаружение классов сгенерированных компилятором в деревьях выражений С#

Я создаю конвертер выражения С# expression-to-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, и я нахожу это (работает в окне Immediate):

expressionType.Name
"<>c__DisplayClass64"
expressionType.GetCustomAttributes(true)
{object[0]}
expressionType.GetCustomAttributes(true).Length
0

Итак, я имею здесь явно сгенерированный компилятором класс без пользовательских атрибутов и, следовательно, без CompilerGeneratedAttribute! Поэтому мой код будет do other stuff, когда я намереваюсь его просто do stuff.

Если бы кто-нибудь мог мне помочь, я был бы очень благодарен. Если это вообще возможно, я бы предпочел не делать ничего грязного, как сопоставление expressionType.Name с чем-то вроде <>.*__DisplayClass.

4b9b3361