NRefactory を使用してメソッドに関連付けられている xml ドキュメントを取得したいと考えています。この回答で見つけた次のコードを使用して、足を濡らしました
var parser = new CSharpParser();
SyntaxTree tree = parser.Parse(code, "test.cs");
CSharpUnresolvedFile file = tree.ToTypeSystem();
foreach (IUnresolvedTypeDefinition type in file.TopLevelTypeDefinitions) {
foreach (IUnresolvedMethod method in type.Methods) {
Console.WriteLine(method.Name);
}
}
しかし、私は IUnresolvedTypeDefinition インターフェイスを見ていましたが、「コメント」プロパティはありません。また、IUnresolvedMethod インターフェイスには「コメント」プロパティがありません。ここにある CodeProject 記事に関連付けられている WinForms アプリケーションを使用してコメントを取得したため、コメントを取得できることはわかっています。
デモの作成者は「ToTypeSystem()」メソッドを使用していません。代わりに、彼は木を横断します。以下は、彼が行っていることの一部です。
SyntaxTree tree = parser.Parse(line, "demo.cs");
foreach (var element in tree.Children)
{
MakeTreeNode(element);
}
static void MakeTreeNode(AstNode node)
{
Console.WriteLine(GetNodeTitle(node));
foreach (AstNode child in node.Children)
{
MakeTreeNode(child);
}
}
static string GetNodeTitle(AstNode node)
{
StringBuilder b = new StringBuilder();
b.Append(node.Role.ToString());
b.Append(": ");
b.Append(node.GetType().Name);
bool hasProperties = false;
foreach (PropertyInfo p in node.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (p.Name == "NodeType" || p.Name == "IsNull" || p.Name == "IsFrozen" || p.Name == "HasChildren")
continue;
if (p.PropertyType == typeof(string) || p.PropertyType.IsEnum || p.PropertyType == typeof(bool))
{
if (!hasProperties)
{
hasProperties = true;
b.Append(" (");
}
else
{
b.Append(", ");
}
b.Append(p.Name);
b.Append(" = ");
try
{
object val = p.GetValue(node, null);
b.Append(val != null ? val.ToString() : "**null**");
}
catch (TargetInvocationException ex)
{
b.Append("**" + ex.InnerException.GetType().Name + "**");
}
}
}
if (hasProperties)
b.Append(")");
return b.ToString() + "\n";
}
NRefactory API に、C# コードのメソッドに関連付けられたドキュメントを取得するメソッドがあるかどうか疑問に思っていました。