获取在另一个程序集/项目中声明的类型的类型信息

时间:2014-04-23 14:33:43

标签: c# roslyn

因为标题说我试图从使用Roslyn在另一个程序集中声明的类型中获取类型信息。最初我尝试通过手动查看引用的程序集来实现这一点,但意识到我没有命名空间信息。

我期待以下工作:

  var workSpace = Roslyn.Services.Workspace.LoadSolution(solFilePath);

  IDocument file = null;
  IProject proje = null;

  Compilation compilation = Compilation.Create("Test");
  List<CommonSyntaxTree> trees = new List<CommonSyntaxTree>();

  foreach (var proj in workSpace.CurrentSolution.Projects)
  {
    foreach (var doc in proj.Documents)
    {
      if (doc.FilePath.ToLower() == filePath.ToLower())
      {
        file = doc;
        proje = proj;
      }
      else trees.Add(doc.GetSyntaxTree());
    }
  }

  var targetTree = file.GetSyntaxTree();

  trees.Add(targetTree);
  var compilation2 = (Compilation)compilation.AddSyntaxTrees(trees);

  var semanticModel = compilation2.GetSemanticModel(targetTree);

  var root = targetTree.GetRoot();

  var className = root.DescendantNodes().OfType<ClassDeclarationSyntax>().ToList().ElementAt(1);

  var properties = className.DescendantNodes().OfType<PropertyDeclarationSyntax>()
      .Where(p => p.Modifiers.Select(syn => syn.ToString().ToLower() == "public").Count() > 0).ToList();

  var typeInfo = semanticModel.GetTypeInfo(properties.First());

  var property = properties.First();

  var symbol = semanticModel.GetDeclaredSymbol(property);

  var symbol2 = semanticModel.GetSymbolInfo(property);

typeInfotypeSyntax都没有我需要的信息,我在这里做错了什么?

这是我正在解析的课程:

   class Foo
  {
    public Bar bar { get; set; }

    public Foo() { }

    public int GetInt(Bar bar, int ret = 5 ){
      return ret;
    }
  }

我试图获取另一个程序集中定义的Bar类的类型信息。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

请勿致电GetTypeInfo。相反,如果您拥有PropertyDeclarationSyntax,请使用该声明语法调用GetDeclaredSymbol,然后您将获得该属性的IPropertySymbol。从那里,你可以抓住IPropertySymbol.Type,这是你正在寻找的类型。