【问题标题】:Trying to get recognize a class instance in roslyn试图识别 roslyn 中的类实例
【发布时间】:2014-09-26 05:01:25
【问题描述】:

我正在编写一个 Visual Studio 扩展,我想通过变量的名称和位置获取变量的类型。

例如: 有一段 C# 代码:

class Program
{
   static void Main(string[] args)
   {
     var flagMick = true;
     Console.WriteLine(""Hello, World!"");
   }
}

我能够与 ExpressionEvaluator 和 DTE 进行通信,我能够从快照中读取数据并了解其位置。我有具体的位置,但是:

我不想“重新学习”c# 解析,这就是 Roslyn 应该做的。

所以我希望我的扩展程序能够识别“FlagMick”的类型,给出它的名称和在屏幕上的位置。

我怎样才能对 Roslyn 做到这一点?

【问题讨论】:

  • “屏幕上的名称和位置”是什么意思?你指的是实际的 X-Y 坐标吗?
  • 类型将从= 运算符右侧的赋值中推断出来(在这种情况下,因为它是var)。我不确定这与它在屏幕上的位置有什么关系。可能你的意思是代码中的位置?
  • name 是他在 flagMick 中的参数名称,位置是我从 TextView 收到的位置。
  • 嘿@Slaks,谢谢你的回答,我希望你能打开一个答案,这样我就可以在那里发表评论:我遇到了可访问性问题:'Microsoft.CodeAnalysis.Text.TextExtensions.GetOpenDocumentInCurrentContextWithChanges(Microsoft.CodeAnalysis .Text.SourceText)' 由于其保护级别而无法访问

标签: c# roslyn


【解决方案1】:

使用以下代码:

var doc = point.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
var model = doc.GetSemanticModelAsync().Result;
var symbol = SymbolFinder.FindSymbolAtPosition(model, point, doc.Project.Solution.Workspace);

您将需要对 Microsoft.CodeAnalysis.EditorFeatures.Text.dll 的引用,您可以通过添加 appropriate NuGet package 来获得它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2020-06-28
    • 2014-06-03
    相关资源
    最近更新 更多