2014-01-23 2 views
7

Допустим, что я опрошен один метод из коллекции методов:Использование Roslyn для C#, как мне получить список всех свойств, которые составляют тип возврата?

var myMethod = someListofMethods.FirstOrDefault(m => m.Identifier.ValueText == myMethodName); 

Теперь я хочу взять тип возвращаемого значения. , ,

var returnType = myMethod.ReturnType; 

. , . и определить (если это не примитив), какие свойства содержатся в этом типе.

Так, например, скажем, тип возвращаемого значения FooObject, который определяется:

public class FooObject{ 
    public string Fizz {get; set; } 
    public string Buzz {get; set; } 
} 

Как правильно опрашивать FooObject для списка из его свойств?

Вот что я уже пробовал:

returnType.DescendantNodes().OfType<PropertyDeclarationSyntax>(); 

Но это не сработало. Заранее спасибо.

ответ

9

Вы смотрите на уровень кода abstract syntax tree (AST). Следовательно, линия:

returnType.DescendantNodes().OfType<PropertyDeclarationSyntax>(); 

ничего не возвращает. returnType в этом контексте - IdentifierNameSyntax узел АСТ, содержащий только текст FooObject. Если вы хотите проанализировать тип возвращаемого, вы должны:

  • интерпретировать синтаксическое дерево с returnType точки зрения, чтобы найти полное пространство имен типа возвращаемого
  • поиска через код, чтобы найти этот тип декларации
  • анализировать объявление типа синтаксическое дерево, чтобы найти все его свойства

Но, это на самом деле то, что компилятор делает, так что вы можете пойти уровня с использованием Рослин на уровне компиляции, например:

var workspace = Workspace.LoadSolution(solutionName); 
var solution = workspace.CurrentSolution; 

var createCommandList = new List<ISymbol>(); 
var @class = solution.Projects.Select(s => s.GetCompilation() 
              .GetTypeByMetadataName(className)) 
           .FirstOrDefault(); 
var method = @class.GetMembers(methodName) 
        .AsList() 
        .Where(s => s.Kind == CommonSymbolKind.Method) 
        .Cast<MethodSymbol>() 
        .FirstOrDefault(); 
var returnType = method.ReturnType as TypeSymbol; 
var returnTypeProperties = returnType.GetMembers() 
            .AsList() 
            .Where(s => s.Kind == SymbolKind.Property) 
            .Select(s => s.Name); 
+0

Работал красиво! Спасибо. –