Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在自定义属性中接受多个参数的正确方法是什么_C#_Code Analysis_Custom Attributes_Params - Fatal编程技术网

C# 在自定义属性中接受多个参数的正确方法是什么

C# 在自定义属性中接受多个参数的正确方法是什么,c#,code-analysis,custom-attributes,params,C#,Code Analysis,Custom Attributes,Params,我在一个MVC4 web应用程序中使用VS2012中的.NET4.5。我试图构建一个接受未知数量参数的自定义属性 我有以下代码: public sealed class MyCustomAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute { private readonly string[] _someStrings; public MyCustomAtt

我在一个MVC4 web应用程序中使用VS2012中的.NET4.5。我试图构建一个接受未知数量参数的自定义属性

我有以下代码:

    public sealed class MyCustomAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute
    {
        private readonly string[] _someStrings;       

        public MyCustomAttribute(params string[] someStrings)
        {
            _someStrings = someStrings;
        }
    }
我自然会得到以下代码分析警告:

CA1019为属性参数定义访问器添加公共只读 的位置参数“SomeString”的属性访问器 属性 “MyCustomAttribute”

如果我用private set定义一个auto属性,我会得到一个警告:我应该返回集合而不是数组

CA1819属性不应返回数组更改 “MyCustomAttribute.SomeString”返回 收集或使其成为 方法

问题是我不想公开一个数组,因为我不希望任何人更改数组中的内容。最多,我想返回一个只读集合。如果我将属性的类型更改为“ReadOnlyCollection”,我会再次收到第一条警告,因为它与参数名称(不区分大小写)上的属性和类型匹配


问题:我如何实现这一点,而不需要抑制警告?

这是一条API可用性规则,如果没有理由通过属性公开值,您可以随意抑制警告。如果确实要公开该值,则ReadOnlyCollection类型的属性将充分满足规则的意图,即使规则代码无法识别该属性。

这是一条API可用性规则,如果没有理由通过属性公开该值,您可以随意取消警告。如果确实要公开该值,则ReadOnlyCollection类型的属性将充分满足规则的意图,即使规则代码无法识别它。

我知道您说过不希望任何人更改数组中的内容,但属性的工作方式有点不同。为什么不公开属性,以便在使用属性时指定值?一旦指定了属性,类或方法中的代码就不能触及该属性。如果我将数组公开,我现在可以通过声明[MyCustom(“lba”,“bla”)]来使用该参数(这仍然会给我问题中的第二个警告)我可以通过反射来编辑数组。我不明白你为什么在谈论公共财产时引用反射。。。甚至私有/内部属性也可以通过反射调用。根据MS指南:属性需要一个字段(使用构造函数设置)和一个公共只读属性。返回数组从来都不是一个好主意,因为它是非常可变的。您正在将哪些数据发送到属性的构造函数中?但是如果你真的需要一个数组,我看不出这个警告有什么问题。我认为你有一个关于反思的观点。一位同事建议返回一个IEnumerable,我将在周一尝试。谢谢所有的建议!我知道你说你不希望任何人改变数组中的内容,但是,属性的工作方式有点不同。为什么不公开属性,以便在使用属性时指定值?一旦指定了属性,类或方法中的代码就不能触及该属性。如果我将数组公开,我现在可以通过声明[MyCustom(“lba”,“bla”)]来使用该参数(这仍然会给我问题中的第二个警告)我可以通过反射来编辑数组。我不明白你为什么在谈论公共财产时引用反射。。。甚至私有/内部属性也可以通过反射调用。根据MS指南:属性需要一个字段(使用构造函数设置)和一个公共只读属性。返回数组从来都不是一个好主意,因为它是非常可变的。您正在将哪些数据发送到属性的构造函数中?但是如果你真的需要一个数组,我看不出这个警告有什么问题。我认为你有一个关于反思的观点。一位同事建议返回一个IEnumerable,我将在周一尝试。谢谢所有的建议!所以你说没有办法?(听起来并不粗鲁,但这并不能真正回答我的问题:p)如果没有抑制,就无法满足CA1019和CA1819的筛选代码。然而,与它的意图相比,CA1019规则的编码方式相当“愚蠢”。该规则的目的是使位置参数的内容在运行时可从属性外部发现(如果适用)。ReadOnlyCollection可以满足您的目的,但是您需要一个抑制,因为规则代码无法神奇地知道这一点?(听起来并不粗鲁,但这并不能真正回答我的问题:p)如果没有抑制,就无法满足CA1019和CA1819的筛选代码。然而,与它的意图相比,CA1019规则的编码方式相当“愚蠢”。该规则的目的是使位置参数的内容在运行时可从属性外部发现(如果适用)。ReadOnlyCollection可以满足这个目的,但是您需要一个抑制,因为规则代码并没有神奇地知道这一点。