动态设置ApiExplorerSettingsAttributes值

时间:2017-06-12 13:42:32

标签: c# attributes

由于很多属性都是通过设计来避免未密封的属性我正在寻找设置属性值的解决方案(我的第一个想法是继承类并设置构造函数检查什么web-config - 密封类不可能):

名称空间ApiExplorerSettingsAttribute

中有System.Web.Http.Description

我希望以下API操作隐藏在案例中,web-config中的值为false:

<Api.Properties.Settings>
  <setting name="Hoster">
    <value>False</value>
  </setting>
</Api.Properties.Settings>

行动将如下所示:

[HttpGet, Route("api/bdlg")]
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(BdlgDataStorage))]
[ApiExplorerSettings(IgnoreApi = Properties.Settings.Default.Hoster)]
private async Task<BdlgDataStorage> GetBdlgStorageValues()
{
    using (var context = new BdlgContext())
        return context.BdlgDataStorages
            .Include(s=>s.ChangeTrack)
            .Where(w=>w.Isle > 56)
            .Select(selectorFunction)
            .ToListAsync();
}

重要的一点是:

[ApiExplorerSettings(IgnoreApi = Properties.Settings.Default.Hoster)]

在这里,我收到编译错误:

  

属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

任何人都知道,我如何设置IgnoreApi的值与web-config中的值相同?

2 个答案:

答案 0 :(得分:3)

你做不到。属性静态编译到程序集中。它们属于成员的元数据。您无法在运行时更改属性。

你必须找到影响ApiExplorerSettings的另一种方法。这篇文章似乎就是你要找的:Dynamically Ignore WebAPI method on controller for api explorer documentation

答案 1 :(得分:0)

我找到的另一个可能的解决方案是使用预处理程序指令(这对我来说已经足够了,因为当它是DEBUG时,操作只能在swagger中显示):

#if DEBUG
    [ApiExplorerSettings(IgnoreApi = true)]
#else
    [ApiExplorerSettings(IgnoreApi = false)]
#endif
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(BdlgDataStorage))]
    [HttpGet, Route("api/bdlg")]
    private async Task<BdlgDataStorage> GetBdlgStorageValues()
    {
        using (var context = new BdlgContext())
            return context.BdlgDataStorages
                .Include(s=>s.ChangeTrack)
                .Where(w=>w.Isle > 56)
                .Select(selectorFunction)
                .ToListAsync();
    }