2014-06-22 29 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我有这个实现,但我没有看到它打破空可参数文档。你有一个例子吗? –

相关问题