2013-12-11 1 views
4

Я играю с пакетом nuget от Roslyn CTP и думал, что знакомлюсь с классом SyntaxVisitor<>, поэтому создаю конвертер Roslyn.Compilers.CSharp.SyntaxNode в System.Linq.Expression (который, похоже, работает для любого кода, который не включает семантические знания, неизвестные AST или предоставленные вне приглашения на посещение).Возможно ли создать что-то вроде метода MethodCallExpression, не зная типы связанных выражений?

Во всяком случае, у меня есть следующий код:

public override Expression VisitInvocationExpression(InvocationExpressionSyntax node) { 
    ??? 
} 

И у меня нет ничего. node имеет Expression свойство, которое может быть решена, посетив его, пока это не метод вызова:

return Expression.Invoke(
    Visit(node.Expression), 
    node.ArgumentList.Arguments.Select(a => Visit(a.Expression)) 
) 

Это, кажется, работает до тех пор, как Expression не метод вызова. Если это вызов метода, хотя (статический, экземпляр или расширение), первый визит завершает вызов VisitMemberAccessExpression, после чего я терпит неудачу (из-за того, что они не являются членами).

Есть ли способ обойти это?

ответ

2

Expression.Call - это путь. Но все же вам нужно будет использовать семантические данные для получения связанных данных отражения, таких как Типы и MethodInfo.

Путь идти о нем:

  1. Get компиляции объекта по телефону Compilation.Create(...) другими словами: скомпилировать программу с помощью Рослин API
  2. Получить SemanticModel из него по телефону GetSemanticModel(ast)
  3. Get TypeInfo вызов GetTypeInfo (выражение)

Итак ... подведение итогов

Compilation.Create(...).GetSemanticModel(ast).GetTypeInfo(expression);