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 Debugconfiguración, se puede intercambiar Releasepara Debugel fileatributo de la includeetiqueta.
Para encontrar una referencia correcta member, namesimplemente abra el Documentation.xmlarchivo 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();