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