我正在使用Roslyn开发一个小的工具来搜索代码库。一种功能是,我可以搜索某个方法是否存在,如果存在,我将返回完整的方法文本以显示在UI上。

我正在使用集成了Roslyn的Visual Studio 2015。我观察到的一个奇怪的情况是某个特定方法是#region内部的第一个方法。

每当我获得该特定方法的全文时,我都会从上一个区域结尾以及当前区域开始部分得到一个额外的#endregion。

我为某个区域内的第一个方法获得的示例输出。

#endregion      -- why is this coming?

#region Public Methods and Operators

/// <summary>
/// My Method's summary.
/// </summary>
/// <param name="param1">
/// The param1.
/// </param>
/// <returns>
/// returns something
/// </returns>
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SampleMethod(Parameter param1)
{
    ....
....
sample code
    return this.RedirectToAction("sample_action");
}


下面给出了我为获取完整的方法文本而编写的代码。

var MethodText = ((MethodDeclarationSyntax)method).ToFullString()


这是预期的工作方式吗?

最佳答案

解析器有一个一般规则,即“一行上的琐事本身会附加到将来某行上的下一个实际标记上”。因此,在这种情况下,该方法之前的所有琐事都将附加到下一个方法。 #endregion没有其他特殊情况的逻辑可以执行其他操作。也许应该,但是今天不应该。

您可能必须编写一些自定义代码来调整显示。例如,您可能要排除所有不是文档注释琐事的琐事。考虑以下更人为的情况:

#region Comment

// some long comment about the method below me

#endregion

void AbandonAllHopeYeWhoEntersHere() { ...}


您要显示吗?老实说,我不太确定。

琐事不是小事。它涉及到在很多情况下弄清用户意图的方法,因此我们采用了简单的规则而不是大量的启发式方法。 (我们通常考虑将琐事重命名为“复杂性”,或警告人们远距离接近的事物,但决定不这样做。)

10-06 07:54