符合CLS的属性和数组参数

时间:2011-10-31 08:03:11

标签: c# attributes cls-compliant

我创建了一个在其构造函数中接受(params)数组的属性。

internal class MyTestAttribute : Attribute
{
    public MyTestAttribute (params Options[] options)
    {
        ....
    }
}

Option这里是一个枚举(有很多值),所以示例调用网站将是

[MyTest(Option.One, Option.Three)]
internal void SomeMethod(int param1, long param2)
{
  ....
}

到目前为止,一切都很好,并且设置正常,但我在每个呼叫站点上收到“ Arrays作为属性参数不符合CLS的”警告。现在,我不得不承认我不需要在C#以外的任何地方使用这个程序集,也不需要像错误一样警告,但数百个警告都变得很烦人。

显而易见的解决方案是关闭CLS合规性,但目前我不能这样做。

是否还有其他一些创建属性的方法仍然可以做同样的事情,但是除去了警告?

2 个答案:

答案 0 :(得分:12)

两个选项:

1:你可以添加一些重载:

private MyTestAttribute(Option[] options) {...}
public MyTestAttribute(Option option0)
          : this(new[] {option0}) {}
public MyTestAttribute(Option option0, Option option1)
          : this(new[] {option0, option1}) {}
public MyTestAttribute(Option option0, Option option1, Option option2)
          : this(new[] {option0, option1, option2}) {}
// add a few more, without going crazy

2:如果Options是枚举,请将枚举标记为[Flags]枚举,并让调用者合并它们:

[MyTest(Option.One | Option.Two)]

使用:

[Flags]
public enum Option {
     None = 0,
     One = 1,
     Two = 2,
     Three = 4,
     Four = 8,
     ...
}

答案 1 :(得分:4)

  

“作为属性参数的数组不符合CLS”

正是它所说的。

唯一的解决方法是创建显式参数,例如:

internal class MyTestAttribute : Attribute
{
    public MyTestAttribute(Option o1) : this(new Option[] { o1 }) {}
    public MyTestAttribute(Option o1, Option o2) : 
      this(new Option[] { o1, o2 }) {}

    MyTestAttribute (Options[] options)
    {
        ....
    }
}

注意:尽管CLS正在被赋予属性类是内部的,但这很有趣。 AFAIK,CLS仅适用于可能的外部成员(公共/受保护)。