2014-01-23 16 views
7

讓我們說,我已經詢問了一個方法從方法的集合:使用Roslyn for 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是AST的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

工作很好!謝謝。 –

相關問題