因为标题说我试图从使用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);
typeInfo
和typeSyntax
都没有我需要的信息,我在这里做错了什么?
这是我正在解析的课程:
class Foo
{
public Bar bar { get; set; }
public Foo() { }
public int GetInt(Bar bar, int ret = 5 ){
return ret;
}
}
我试图获取另一个程序集中定义的Bar
类的类型信息。
感谢您的帮助。
答案 0 :(得分:3)
请勿致电GetTypeInfo
。相反,如果您拥有PropertyDeclarationSyntax
,请使用该声明语法调用GetDeclaredSymbol
,然后您将获得该属性的IPropertySymbol
。从那里,你可以抓住IPropertySymbol.Type
,这是你正在寻找的类型。