使用Roslyn为某个方法的调用者提供信息

时间:2016-11-24 09:54:43

标签: c# visual-studio-2015 roslyn

我有一个带1重载的方法,我想找出Roslyn是否有人正在调用重载方法并在这种情况下显示提示。

方法如下:

public void Info(string message, [CallerMemberName] string memberName = "")
{
}


public void Info(string message, string secondMessage, [CallerMemberName] string memberName = "")
{
}


如果有人输入例如:

Info("The message", secondMessage: "Second message");

我想向开发者展示一些信息。


可以用Roslyn做到这一点吗?

2 个答案:

答案 0 :(得分:1)

  

可以用Roslyn做到这一点吗?

是。您需要从语义模型中获取方法符号,然后使用FindReferencesAsync

// Get your semantic model
var semanticModel = compilation.GetSemanticModel(tree);
//Or
var semanticModel = document.GetSemanticModelAsync();

// Get the method you want to find references to.
// You have a lot of ways to do that, but for example:
var method = doc.GetSyntaxRootAsync().
     Result.DescendantNodes().
     OfType<InvocationExpressionSyntax>().
     First();
//Or
var method = root.DescendantNodes().
     OfType<InvocationExpressionSyntax>().
     First();

//Then get the symbol info of the method
var methodSymbol = semanticModel.GetSymbolInfo(method).Symbol;

// And finally
SymbolFinder.FindReferencesAsync(methodSymbol, solution).Result

我建议您阅读Solution\Project\DocumentSyntaxTree\Root\NodeCompilation\SemanticModel

一旦你理解了这一点,就可以很容易地将分析器编写成你想要的。我可以在这里粘贴一个分析器示例,但您可以在网上找到更多内容(例如,请查看我的评论中的链接)。

答案 1 :(得分:1)

根据具体情况,只需添加[Obsolete] 即可:

[Obsolete("You're probably doing it wrong, neighbour", false)]
public void Info(string message, string secondMessage,
     [CallerMemberName] string memberName = "")

如果您想在没有警告的情况下从您自己的代码中调用它:

#pragma warning disable 0618
Info("foo", "bar", "blap");
#pragma warning restore 0618