Bueno, hay una especie de solución nativa que encontré para .NET Core 2.2
La idea es usar <include>
etiqueta.
Puedes agregar <GenerateDocumentationFile>true</GenerateDocumentationFile>
tu.csproj
archivo.
Es posible que tenga una interfaz:
namespace YourNamespace
{
/// <summary>
/// Represents interface for a type.
/// </summary>
public interface IType
{
/// <summary>
/// Executes an action in read access mode.
/// </summary>
void ExecuteAction();
}
}
Y algo que hereda de ella:
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, da un poco de miedo, pero agrega los elementos esperados al YourNamespace.xml
.
Si se construye Debug
configuración, se puede intercambiar Release
para Debug
el file
atributo de la include
etiqueta.
Para encontrar una referencia correcta member
, name
simplemente abra el Documentation.xml
archivo generado .
También asumo que este enfoque requiere que un proyecto o solución se compile al menos dos veces (la primera vez para crear un archivo XML inicial y la segunda para copiar elementos de él a sí mismo).
El lado positivo es que Visual Studio valida los elementos copiados, por lo que es mucho más fácil mantener la documentación y el código sincronizados con la interfaz / clase base, etc. (por ejemplo, nombres de argumentos, nombres de parámetros de tipo, etc.).
En mi proyecto, terminé con ambos <inheritdoc/>
(para DocFX) y <include/>
(Para publicar paquetes NuGet y para validación en 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();