Как правильно принимать несколько аргументов в настраиваемом атрибуте

Я работаю с .NET 4.5 в VS2012 в веб-приложении MVC4. Я пытаюсь создать настраиваемый атрибут, который принимает еще неизвестное количество аргументов.

У меня такой код:

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

        public MyCustomAttribute(params string[] someStrings)
        {
            _someStrings = someStrings;
        }
    }

и, естественно, я получаю следующее предупреждение анализа кода:

CA1019 Определение средств доступа для аргументов атрибута Добавьте общедоступное средство доступа только для чтения для позиционного аргумента someStrings атрибута MyCustomAttribute.

Если я определяю свойство auto с частным набором, я получаю предупреждение о том, что я должен возвращать коллекции вместо массива

Свойства CA1819 не должны возвращать массивы. Измените MyCustomAttribute.SomeStrings, чтобы вернуть коллекцию или сделать ее методом.

Проблема в том, что я не хочу раскрывать массив, так как я не хочу, чтобы кто-либо менял то, что находится внутри массива. В лучшем случае я хотел бы вернуть ReadOnlyCollection. Если я изменю тип свойства на «ReadOnlyCollection», я снова получаю первое предупреждение, поскольку оно соответствует свойству по имени аргумента (без учета регистра) и типу.

Вопрос: Как я могу этого добиться, не подавляя предупреждения?


person Yoeri    schedule 14.06.2013    source источник
comment
Я знаю, вы говорите, что не хотите, чтобы кто-либо менял содержимое массива, но атрибуты работают немного иначе. Почему бы просто не сделать свойство общедоступным, чтобы вы могли указывать значения при использовании атрибута? После того, как вы укажете атрибут, код внутри класса или метода не сможет коснуться атрибута.   -  person Justin Helgerson    schedule 14.06.2013
comment
Теперь я могу использовать аргумент, объявив [MyCustom (lba, bla)]. Если я сделаю массив общедоступным (что все равно даст мне второе предупреждение в моем вопросе), я смогу отредактировать массив через отражение.   -  person Yoeri    schedule 14.06.2013
comment
Я не понимаю, почему вы ссылаетесь на отражение, когда говорите об общедоступном свойстве ... Даже частное / внутреннее свойство можно вызвать с помощью отражения. Согласно рекомендациям MS: msdn.microsoft.com/en-us/library/ 84c42s56.aspx атрибут требует как поля (которое устанавливается с помощью конструктора), так и общедоступного свойства только для чтения. Возврат массива никогда не является хорошей идеей, поскольку он очень изменчив. Какие данные вы отправляете в конструктор атрибута? Но если вам действительно нужен массив, я не вижу проблемы в подавлении предупреждения.   -  person Frederik Prijck    schedule 14.06.2013
comment
это переменное количество аргументов (см. код), и это неявный массив. Я думаю, у вас есть точка зрения на размышления. Коллега предложил вернуть IEnumerable, я собираюсь попробовать это в понедельник. Спасибо за все предложения!   -  person Yoeri    schedule 15.06.2013


Ответы (1)


Это правило удобства использования API, и вы можете просто подавить предупреждение, если нет причин раскрывать значение через свойство. Если вы действительно хотите раскрыть значение, свойство типа ReadOnlyCollection в полной мере выполнит назначение правила, даже если код правила его не распознает.

person Nicole Calinoiu    schedule 14.06.2013
comment
Значит, по вашему мнению, выхода нет? (чтобы не показаться грубым, но это не совсем ответ на мой вопрос: p) - person Yoeri; 15.06.2013
comment
Невозможно удовлетворить код экранирования CA1019 и CA1819 без подавления. Однако способ кодирования правила CA1019 довольно тупой по сравнению с его намерением. Назначение правила состоит в том, чтобы сделать содержимое позиционного аргумента (ов) доступным для обнаружения извне атрибута во время выполнения, если это уместно. ReadOnlyCollection удовлетворит намерение, но вам понадобится подавление, поскольку код правила магическим образом этого не знает. - person Nicole Calinoiu; 17.06.2013