更新:二重化された名前空間の問題が修正されました。将来の読者は、以下のコードを調整する必要があるかもしれません。"${namespace}${namespace}${class}"
具体的には、に変更する必要がある場合があります"${namespace}${class}"
。警告しなかったなんて言わないで!
この問題は、F# レコード型の XML ドキュメントの生成方法に関連する 2 つのバグが原因で発生します。
「F# コンパイラがドキュメント ファイルを生成するとき、実際には、レコード メンバーのパブリック プロパティではなく、内部フィールドをドキュメント化します。」—<a href="https://stackoverflow.com/a/21302280/230390">Axel Habermaier
レコード メンバーの名前空間は、生成された XML で 2 倍になります。
Visual Studio 2013 (またはおそらく F# コンパイラー) への更新がない限り、これに対する最善の修正は、生成された XML をクリーンアップするビルド後のアクションでしょう。今のところ、members.In のドキュメントを取得するメソッドを変更することを含む一時的な修正がありAreas/HelpPage/XmlDocumentationProvider
、シグネチャを持つメソッドを見つけます。
public string GetDocumentation(MemberInfo member)
…定義を次のように置き換えます。
public string GetDocumentation(MemberInfo member)
{
string selectExpression;
bool isRecord = FSharpType.IsRecord(member.DeclaringType, FSharpOption<BindingFlags>.None);
if (isRecord)
{
// Workaround for a bug in VS 2013.1: duplicated namespace in documentation for record types.
Regex matchTypeName = new Regex(@"(?<namespace>(?:[_\p{L}\p{Nl}]+\.)*)(?<class>[_\p{L}\p{Nl}]+)$");
string classExpression = matchTypeName.Replace(GetTypeName(member.DeclaringType), "${namespace}${namespace}${class}");
string memberExpression = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", classExpression, member.Name);
selectExpression = String.Format(CultureInfo.InvariantCulture, FieldExpression, memberExpression);
}
else
{
string expression = member.MemberType == MemberTypes.Field ? FieldExpression : PropertyExpression;
string memberName = String.Format(CultureInfo.InvariantCulture, "{0}.{1}", GetTypeName(member.DeclaringType), member.Name);
selectExpression = String.Format(CultureInfo.InvariantCulture, expression, memberName);
}
XPathNavigator propertyNode = _documentNavigator.SelectSingleNode(selectExpression);
return GetTagValue(propertyNode, "summary");
}
これは非常に一時的な修正です。Web API ヘルプ ページ パッケージを更新すると上書きされ、前述のバグが修正されると問題が発生します。より良い解決策を見つける手助けをしていただければ幸いです。