Я создаю конвертер выражения С# 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
.