2012-03-27 4 views
6

Нам нужно «защитить» класс от статических методов в целях безопасности. Мы не хотим, чтобы новички-разработчики следили за предложениями инструментов кодирования, чтобы сделать элемент статичным, поскольку нам нужно использовать конструктор с паролем для контроля доступа к этому классу.Требовать, чтобы класс был установлен в C#?

Есть ли способ защитить класс .NET на C#, чтобы предотвратить его наличие каких-либо статических членов?

Будет ли такая функция, если она недоступна, для будущей версии .NET?

спасибо.

+10

Это похоже на то, что ваши инструменты отвечают за пользователя. Почему бы не просто обучить своих разработчиков тому, как правильно использовать API? – rossipedia

+2

Мне бы очень хотелось услышать рассуждения об устранении статических методов. Можешь поделиться, пожалуйста? –

+10

Newbie devs vs. devs делает конструкторы с паролями для ограничения экземпляра/наследования? вау, и нет его не стоящей функции – meandmycode

ответ

8

Возможно, вы использовали StyleCop для принудительного применения специального правила. Однако это должно было бы быть реализовано как действие сборки.

В качестве альтернативы вы можете использовать FxCop для анализа двоичных файлов.

3

Вы можете запустить проверку с использованием отражения во время выполнения, но кроме этого не существует языковой функции, предотвращающей статические элементы.

Я не могу придумать, чтобы не использовать эту функцию. Это проблема общения, а не реализация.

В вашем случае вы можете разместить защищенную функциональность в абстрактном базовом классе и запустить проверку, чтобы проверить, разрешен ли пользователь до выполнения какой-либо защищенной функции.

+0

Добавление статического конструктора, который проверяет наличие статических методов, легко записать. – CodesInChaos

0

Я думаю, что закрытого класса хватит, хотя статические члены разрешены в первоначальном объявлении класса. Я думаю, что производные классы не позволят более статическим членам.

9

Проще всего было бы настроить FxCop на ваш сервер сборки и написать собственное правило FxCop для проверки статических членов.

This question содержит подробную информацию о том, как написать собственное правило FxCop.


Альтернативно, как SimpleCoder отметил, вы можете использовать StyleCop для обеспечения соблюдения правила на исходном коде.

This page описывает, как настроить StyleCop с помощью msbuild.

0

Должен признаться, я никогда не слышал о такой схеме безопасности. Я думаю, что есть веская причина, по которой я не слышал об этом, ты уверен, что он настолько защищен, насколько ты этого хочешь?

Требуя, чтобы конструктор содержал пароль, вы пытаетесь защитить себя от людей, которые используют ваш класс. Но эти люди могут декомпилировать и перекомпилировать ваш класс, чтобы удалить проверку пароля - так что же вы защитили?

29

Мы должны использовать конструктор с паролем для контроля доступа к этому классу.

Это звучит как монументально плохая идея, но, конечно, я ничего не знаю о проблеме безопасности, которую вы пытаетесь решить. Это гораздо более интересный вопрос, чем ваш вопрос: Какова угроза, которую вы пытаетесь защитить? Возможно, это лучший способ сделать это.

Есть ли способ защитить класс .NET на C#, чтобы предотвратить его наличие каких-либо статических элементов?

У старших разработчиков обзор проверок младших разработчиков. Что вы должны делать в любом случае, но особенно, если класс имеет некоторую концепцию безопасности.

Будет ли такая функция, если она недоступна, для будущей версии .NET?

Это вряд ли в крайнем случае.

спасибо.

Добро пожаловать!

+3

Украл мысли прямо из моего мозга. – StriplingWarrior

+5

+5 для 'Добро пожаловать!' –

+2

@SimpleCoder: Моя мать научила меня говорить, что когда кто-то благодарит меня. –

0

Предложения

  1. Обучение
  2. Подробнее Обучение
  3. Код Отзывы
  4. Другие предложили StyleCop или FxCop - как хорошие варианты
  5. Если # 4 терпит неудачу - больше тренировки - на этот раз связать его обзор производительности. :)
0

Я в значительной степени согласен с Эриком Липпертом. Но в таких случаях я хочу сделать что-то вроде этого (иногда просто для того, чтобы не допустить ошибок), я пытаюсь написать для него единичный тест. Например:

[Test] 
public void Class_should_not_have_static_methods() 
{ 
    var staticMethods = typeof (Foo).GetMethods().Where(x => x.IsStatic); 

    Assert.That(staticMethods.Count(), Is.EqualTo(0), "Static methods: " + string.Join(", ", staticMethods.Select(x => x.Name))); 
} 
Смежные вопросы