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

Я создаю конвертер выражений C# в 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, и я нахожу это (работающее в окне интерпретации):

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

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

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

11
задан svick 13 June 2012 в 10:18
поделиться