Nun, es gibt eine Art native Lösung, die ich für .NET Core 2.2 gefunden habe
Die Idee ist, <include>
Tag zu verwenden .
Sie können hinzufügen <GenerateDocumentationFile>true</GenerateDocumentationFile>
Ihre .csproj
Datei.
Möglicherweise haben Sie eine Schnittstelle:
namespace YourNamespace
{
/// <summary>
/// Represents interface for a type.
/// </summary>
public interface IType
{
/// <summary>
/// Executes an action in read access mode.
/// </summary>
void ExecuteAction();
}
}
Und etwas, das davon erbt:
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, es ist ein bisschen beängstigend, aber es fügt die erwarteten Elemente hinzu YourNamespace.xml
.
Wenn Sie bauen Debug
Konfiguration können Sie tauschen Release
für Debug
im file
Attribut - include
Tag.
Um eine korrekte zu finden member
‚s name
nur offen erzeugt Referenz - Documentation.xml
Datei.
Ich gehe auch davon aus, dass für diesen Ansatz ein Projekt oder eine Lösung mindestens zweimal erstellt werden muss (zum ersten Mal, um eine erste XML-Datei zu erstellen, und zum zweiten Mal, um Elemente daraus in sich selbst zu kopieren).
Die gute Seite ist, dass Visual Studio kopierte Elemente validiert, sodass es viel einfacher ist, Dokumentation und Code mit der Schnittstelle / Basisklasse usw. synchron zu halten (z. B. Namen von Argumenten, Namen von Typparametern usw.).
Bei meinem Projekt habe ich sowohl <inheritdoc/>
(für DocFX) als auch <include/>
(für die Veröffentlichung von NuGet-Paketen und für die Validierung in Visual Studio) Folgendes erreicht :
/// <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();