2014-06-22 53 views
8

我對ASP.NET Web API幫助頁面有疑問。ASP.NET Web API幫助頁面無法處理通用類型控制器

通常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"; 
    } 
} 

如果我在第二部分中使用代碼,HelpPages可以生成API文檔,但不會產生API註釋。我的兩個例子之間的區別只是第二節代碼使用泛型類型。

API 
GET api/Values/Get/{id} 

Description 
Testing API 

API 
POST api/Values/Do 

Description 
null 

在該方法Do(),註釋不顯示與第一

相比是否有任何解決方案來解決這些問題?

回答

12

我能夠通過調整XmlDocumentationProvider中的一些代碼來解決此問題。

XmlDocumentationProvider.GetTypeName(Type)原來的FPGA實現如下:

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 {bool}而不是Nullable`1)。只有通用名稱本身是在xml文件中定義的。

到代碼的簡單改變它獲取名稱/引用文檔中的泛型類正確:

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

做出這樣的轉變後,註釋開始爲泛型類型正確顯示,對我來說,這也沒有破壞別的。

+0

另一方面,這打破了獲取具有可爲空參數的方法的文檔。 –

+0

@MotlicekPetr我有這個實現,但我沒有看到它打破空可參數文檔。你有一個例子嗎? –

相關問題