SWe*_*eko 6 c# attributes cls-compliant
我创建了一个在其构造函数中接受(params)数组的属性.
internal class MyTestAttribute : Attribute
{
public MyTestAttribute (params Options[] options)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
Option 这是一个枚举(有很多值),所以一个示例调用站点将是
[MyTest(Option.One, Option.Three)]
internal void SomeMethod(int param1, long param2)
{
....
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好,并且设置正常,但我在每个呼叫站点上收到" Arrays as attribute arguments is not CLS-compliant "警告.现在,我不得不承认我不需要在C#以外的任何地方使用这个程序集,也不需要警告错误,但数百个警告变得烦人.
显而易见的解决方案是关闭CLS合规性,但目前我无法做到这一点.
是否有一些其他方法来创建属性仍然会做同样的事情,但摆脱警告?
Mar*_*ell 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
Run Code Online (Sandbox Code Playgroud)
2:如果Options是枚举,则将枚举标记为[Flags]枚举,并让调用者将它们组合在一起:
[MyTest(Option.One | Option.Two)]
Run Code Online (Sandbox Code Playgroud)
有:
[Flags]
public enum Option {
None = 0,
One = 1,
Two = 2,
Three = 4,
Four = 8,
...
}
Run Code Online (Sandbox Code Playgroud)
“数组作为属性参数不符合 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)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
注意:有趣的是,考虑到属性类是内部的,CLS 正在被遵守。AFAIK,CLS 仅适用于可能的外部成员(公共/受保护)进行验证。