Bem, existe um tipo de solução nativa que encontrei para o .NET Core 2.2
A ideia é usar <include>
tag.
Você pode adicionar <GenerateDocumentationFile>true</GenerateDocumentationFile>
seu .csproj
arquivo.
Você pode ter uma interface:
namespace YourNamespace
{
/// <summary>
/// Represents interface for a type.
/// </summary>
public interface IType
{
/// <summary>
/// Executes an action in read access mode.
/// </summary>
void ExecuteAction();
}
}
E algo que herda disso:
using System;
namespace YourNamespace
{
/// <summary>
/// A type inherited from <see cref="IType"/> interface.
/// </summary>
public class InheritedType : IType
{
/// <include file='bin\Release\netstandard2.0\YourNamespace.xml' path='doc/members/member[@name="M:YourNamespace.IType.ExecuteAction()"]/*'/>
public void ExecuteAction() => Console.WriteLine("Action is executed.");
}
}
Ok, é um pouco assustador, mas adiciona os elementos esperados ao YourNamespace.xml
.
Se você construir Debug
a configuração, você pode trocar Release
para Debug
no file
atributo da include
tag.
Para encontrar uma referência correta member
, name
basta abrir o Documentation.xml
arquivo gerado .
Também presumo que essa abordagem requer que um projeto ou solução seja compilado pelo menos duas vezes (a primeira vez para criar um arquivo XML inicial e a segunda vez para copiar elementos dele para si mesmo).
O lado bom é que o Visual Studio valida os elementos copiados, então é muito mais fácil manter a documentação e o código em sincronia com a interface / classe base, etc (por exemplo, nomes de argumentos, nomes de parâmetros de tipo, etc).
No meu projeto, terminei com <inheritdoc/>
(para DocFX) e <include/>
(para publicação de pacotes NuGet e para validação no Visual Studio):
/// <inheritdoc />
/// <include file='bin\Release\netstandard2.0\Platform.Threading.xml' path='doc/members/member[@name="M:Platform.Threading.Synchronization.ISynchronization.ExecuteReadOperation(System.Action)"]/*'/>
public void ExecuteReadOperation(Action action) => action();