更新:doubled namespace issue has been fixed。未来的读者可能需要调整下面的代码。具体来说,您可能需要将"${namespace}${namespace}${class}" 更改为"${namespace}${class}"。别说我没警告过你!
问题的出现是因为与如何为 F# 记录类型生成 XML 文档相关的两个错误:
“当F#编译器生成文档文件时,它实际上记录的是内部字段而不是记录成员的公共属性。”—Axel Habermaier
生成的 XML 中的namespace of a record member is doubled。
除非更新到 Visual Studio 2013(或者可能只是 F# 编译器),否则最好的解决方法可能是清理生成的 XML 的构建后操作。目前,我有一个临时修复,涉及更改获取成员文档的方法。在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 帮助页面包,它将被覆盖,如果上述错误得到修复,它将破坏一切。非常感谢任何帮助找到更好的解决方案。