【问题标题】:What is the proper way to accept multiple arguments in a custom attribute在自定义属性中接受多个参数的正确方法是什么
【发布时间】:2013-06-17 17:35:24
【问题描述】:

我在一个 MVC4 Web 应用程序中使用 VS2012 中的 .NET 4.5。我正在尝试构建一个接受未知数量参数的自定义属性。

我有以下代码:

    public sealed class MyCustomAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
    {
        private readonly string[] _someStrings;       

        public MyCustomAttribute(params string[] someStrings)
        {
            _someStrings = someStrings;
        }
    }

我自然会收到以下代码分析警告:

CA1019 为属性参数定义访问器 添加公共只读 位置参数“someStrings”的属性访问器 属性 '我的自定义属性'。

如果我用私有集定义一个自动属性,我会收到警告说我应该返回集合而不是数组

CA1819 属性不应返回数组 更改 'MyCustomAttribute.SomeStrings' 返回一个 收藏或制作 方法。

问题是我不想公开数组,因为我不希望任何人更改数组中的内容。最多,我想返回一个 ReadOnlyCollection。如果我将属性的类型更改为“ReadOnlyCollection”,我会再次收到第一个警告,因为它与参数名称(不区分大小写)和类型上的属性匹配。

问题:我怎样才能做到这一点,而不需要抑制警告?

【问题讨论】:

  • 我知道您说您不希望任何人更改数组中的内容,但是,属性的​​工作方式略有不同。为什么不将属性公开,以便在使用属性时指定值?一旦指定了属性,类或方法内部的代码就不能接触到属性了。
  • 我现在可以通过声明 [MyCustom("lba", "bla")] 来使用参数如果我将数组公开(这仍然会给我的问题中的第二个警告)我可以编辑通过反射的数组。
  • 我不明白你为什么在谈论公共属性时提到反射......即使是私有/内部属性也可以用反射来调用。根据 MS 指南:msdn.microsoft.com/en-us/library/84c42s56.aspx 一个属性需要一个字段(使用构造函数设置)和一个公共只读属性。返回一个数组从来都不是一个好主意,因为它非常可变。您将哪些数据发送到属性的构造函数?但是如果你真的需要一个数组,我看不出抑制警告的问题。
  • 这是一个可变数量的参数(参考代码),这是一个隐式数组。我认为你对反思有意见。一位同事建议返回一个 IEnumerable,我将在星期一尝试。感谢到目前为止的所有建议!

标签: c# code-analysis custom-attributes params


【解决方案1】:

这是一个 API 可用性规则,如果没有理由通过属性公开值,您可以简单地取消警告。如果您确实想公开该值,则 ReadOnlyCollection 类型的属性将充分满足规则的意图,即使规则代码无法识别它。

【讨论】:

  • 那么按照你的说法,没有办法吗? (听起来不粗鲁,但这并不能真正回答我的问题:p)
  • 没有抑制就无法同时满足 CA1019 和 CA1819 的筛选代码。然而,CA1019 规则的编码方式与其意图相比相当“愚蠢”。如果合适的话,该规则的目的是使位置参数的内容在运行时可从属性外部发现。 ReadOnlyCollection 将满足意图,但您将需要抑制,因为规则代码不会神奇地知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多