【发布时间】: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