符合CLS的属性和数组参数
本文关键字:数组 参数 属性 CLS 符合 | 更新日期: 2023-09-27 18:12:45
我已经创建了一个属性,在它的构造函数中接受一个(params)数组。
internal class MyTestAttribute : Attribute
{
public MyTestAttribute (params Options[] options)
{
....
}
}
Option
在这里是一个枚举(有很多值),所以一个示例调用站点将是
[MyTest(Option.One, Option.Three)]
internal void SomeMethod(int param1, long param2)
{
....
}
到目前为止一切都很好,设置工作,但是我在每个调用站点上收到一个"数组作为属性参数不符合cls "警告。现在,我必须承认我不需要在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被抱怨给定的属性类是内部的。当然,CLS只能在可能的外部成员(public/protected)上进行验证。