8

ASP.NET Web API HelpPages について質問があります。

通常、HelpPages は XMLDocumentation サンプル コードによって WebAPI を生成できます。

public class ValueControllerBase : ApiController
{
    /// <summary>
    /// Base Do
    /// </summary>
    public IEnumerable<string> Do()
    {
       return new string[] { "value1", "value2" };
    }
}

public class ValuesController : ValueControllerBase
{
    /// <summary>
    /// Testing API
    /// </summary>
    public string Get(int id)
    {
        return "value";
    }
}

これは、次のように正常に生成できます。

API
GET api/Values/Get/{id}

Description
Testing API

API
POST api/Values/Do

Description
Base Do

しかし、汎用ベース コントローラを使用すると、API ドキュメントは生成されません。

サンプル:

public class ValueControllerBase<T> : ApiController
{
    /// <summary>
    /// Base Do
    /// </summary>
    public IEnumerable<string> Do()
    {
        return new string[] { "value1", "value2" };
    }
}

public class ValuesController<String> : ValueControllerBase
{
    /// <summary>
    /// Testing API
    /// </summary>
    public string Get(int id)
    {
        return "value";
    }
}

2 番目のセクションのコードを使用すると、HelpPages は API ドキュメントを生成できますが、API 注釈は生成しません。私の 2 つの例の違いは、ジェネリック型を使用する 2 番目のセクション コードだけです。

API
GET api/Values/Get/{id}  

Description
Testing API

API
POST api/Values/Do

Description
null

メソッドDo()では、最初と比較して注釈が表示されません

これらの問題を解決する解決策はありますか?

4

1 に答える 1

14

の一部のコードを調整することで、これを解決できましたXmlDocumentationProvider

の元の実装XmlDocumentationProvider.GetTypeName(Type)は次のとおりです。

private static string GetTypeName(Type type)
{
    string name = type.FullName;
    if (type.IsGenericType)
    {
        // Format the generic type name to something like: Generic{System.Int32,System.String}
        Type genericType = type.GetGenericTypeDefinition();
        Type[] genericArguments = type.GetGenericArguments();
        string genericTypeName = genericType.FullName;

        // Trim the generic parameter counts from the name
        genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`'));
        string[] argumentTypeNames = genericArguments.Select(t => GetTypeName(t)).ToArray();
        name = String.Format(CultureInfo.InvariantCulture, "{0}{{{1}}}", genericTypeName, String.Join(",", argumentTypeNames));
    }
    if (type.IsNested)
    {
        // Changing the nested type name from OuterType+InnerType to OuterType.InnerType to match the XML documentation syntax.
        name = name.Replace("+", ".");
    }

    return name;
}

理由はわかりませんが、一般的な型名自体ではなく、実際の一般的な属性を含むように xml ルックアップの型名を作成しようとします (たとえば、Nullable`1 ではなく Nullable{bool} を作成します)。xml ファイルで定義されるのは、総称名自体だけです。

コードを簡単に変更するだけで、ジェネリック クラスのドキュメントを正しく命名/参照できるようになります。

....
if (type.IsGenericType)
{
    Type genericType = type.GetGenericTypeDefinition();
    name = genericType.FullName;
}
....

その変更を行った後、ジェネリック型の注釈が正しく表示されるようになりました。私にとっては、これによって他の問題が発生することもありませんでした。

于 2014-12-19T16:52:20.147 に答える