c# – 使用Roslyn获取项目中引用类型的列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用Roslyn获取项目中引用类型的列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2691字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用Roslyn获取项目中引用类型的列表](/upload/InfoBanner/zyjiaocheng/824/3ffd7ae8ddcf47fe9dfb4ba6b46db999.jpg)
我想获得项目中所有使用类型的列表,例如:
var x = 1;
var y = x.ToString().GetType();
代码应该返回System.Int32,System.String,System.Type.
我所拥有的是慢慢…对于每个文件(语法树),我执行以下操作:
var root = await syntaxTree.GetRootAsync();
var nodes = root.DescendantNodes(n => true);
if (nodes != null)
{
var syntaxNodes = nodes as SyntaxNode[] ?? nodes.ToArray();
// IdentifierNameSyntax:
// - var keyword
// - identifiers of any kind (including type names)
var namedTypes = syntaxNodes
.OfType<IdentifierNameSyntax>()
.Select(id => this.compilation
.GetSemanticModel(id.SyntaxTree)
.GetSymbolInfo(id)
.Symbol)
.OfType<INamedTypeSymbol>()
.ToArray();
// add the found types to the list
this.AddRange(namedTypes);
// ExpressionSyntax:
// - method calls
// - property uses
// - field uses
// - all kinds of composite expressions
var expressionSyntaxs = syntaxNodes
.OfType<ExpressionSyntax>()
.ToList();
var typeSymbols = new List<ITypeSymbol>();
for (int index = 0; index < expressionSyntaxs.Count; index++)
{
ExpressionSyntax ma = expressionSyntaxs[index];
typeSymbols.Add(this.compilation
.GetSemanticModel(ma.SyntaxTree)
.GetTypeInfo(ma)
.Type);
}
var expressionTypes = typeSymbols
.OfType<INamedTypeSymbol>()
.ToArray();
// add the found types to the list
this.AddRange(expressionTypes);
}
动机:
我正在制作一个分析项目的工具,并告诉我们.Net框架版本支持给定的项目(例如Portable .Net Frameworks).
我希望在编译之前将一组使用过的类型与框架中的一组可用类型进行匹配会更快.
对于小文件,这段代码足够快,并且总时间少于使用每个可能的框架进行编译的时间……但是对于大文件来说这是不可接受的.
有没有办法以可接受的方式获取类型列表?
解决方法:
所以,我已经吸取了教训:永远不要假设一个不可变结构会缓存任何计算,因为两个调用会返回相同的结果.
确实,当方法是纯粹的时,返回在结构上总是相同的,但它不必是相同的实例.
我的假设导致我出错:认为this.compilation.GetSemanticModel(id.SyntaxTree)将始终返回给定SyntaxTree的语义模型的相同实例……这不是真的.
我将代码更改为以下内容,现在速度非常快:
var root = await syntaxTree.GetRootAsync();
var nodes = root.DescendantNodes(n => true);
var st = root.SyntaxTree;
var sm = this.compilation.GetSemanticModel(st);
if (nodes != null)
{
var syntaxNodes = nodes as SyntaxNode[] ?? nodes.ToArray();
// IdentifierNameSyntax:
// - var keyword
// - identifiers of any kind (including type names)
var namedTypes = syntaxNodes
.OfType<IdentifierNameSyntax>()
.Select(id => sm.GetSymbolInfo(id).Symbol)
.OfType<INamedTypeSymbol>()
.ToArray();
this.Add(namedTypes);
// ExpressionSyntax:
// - method calls
// - property uses
// - field uses
// - all kinds of composite expressions
var expressionTypes = syntaxNodes
.OfType<ExpressionSyntax>()
.Select(ma => sm.GetTypeInfo(ma).Type)
.OfType<INamedTypeSymbol>()
.ToArray();
this.Add(expressionTypes);
}
内容总结
以上是互联网集市为您收集整理的c# – 使用Roslyn获取项目中引用类型的列表全部内容,希望文章能够帮你解决c# – 使用Roslyn获取项目中引用类型的列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。