嗯,有一种原生解决方案,我为 .NET Core 2.2 找到的
这个想法是使用<include>
标签。
您可以添加<GenerateDocumentationFile>true</GenerateDocumentationFile>
您.csproj
的文件。
你可能有一个界面:
namespace YourNamespace
{
/// <summary>
/// Represents interface for a type.
/// </summary>
public interface IType
{
/// <summary>
/// Executes an action in read access mode.
/// </summary>
void ExecuteAction();
}
}
以及从中继承的东西:
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.");
}
}
好吧,这有点吓人,但它确实将预期的元素添加到YourNamespace.xml
.
如果您构建配置,您可以在标签的属性中进行交换Debug
。Release
Debug
file
include
要找到正确member
的name
引用,只需打开生成的Documentation.xml
文件。
我还假设这种方法需要至少构建两次项目或解决方案(第一次创建初始 XML 文件,第二次将元素从其中复制到自身)。
好的一面是 Visual Studio 验证复制的元素,因此更容易使文档和代码与接口/基类等保持同步(例如参数名称、类型参数名称等)。
在我的项目中,我最终得到了<inheritdoc/>
(用于 DocFX)和<include/>
(用于发布 NuGet 包并在 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();