符合CLS的属性和数组参数

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

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

这里的Option是一个枚举(有很多值),因此一个示例调用站点将是

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

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

显而易见的解决方案是关闭CLS合规性,但目前我无法做到这一点。

有没有其他方法来创建属性仍然会做同样的事情,但摆脱警告?

两种选择:

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, ... } 

“作为属性参数的数组不符合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仅适用于可能的外部成员(公共/受保护)。