2010-05-16 2 views
1

У меня есть атрибут, который позволяет называть его SomeAttribute и классом, который должен быть удостоен класса, который имеет SomeAttribute. Так что это, как я делаю это сейчас:C#: Убедитесь, что параметр имеет атрибут

public class Test() 
{ 
    public Test(SomeType obj) 
    { 
     if(!obj.GetType().IsDefined(typeof(SomeAttribute), false)) 
     { 
      throw new ArgumentException("Errormessage"); 
     } 
    } 
} 

Но это означает, что я не получаю никаких ошибок во время компиляции, но где-то во время выполнения, если OBJ не имеет атрибута. Есть ли способ указать в объявлении метода, что параметр должен иметь некоторый атрибут? Итак, я получаю ошибки, я компилирую время при использовании неправильных параметров, или мне нужно использовать пустой интерфейс?

ответ

1

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

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

+0

На самом деле я задаюсь вопросом, есть ли способ сделать это, используя кодовые контракты? У меня очень мало опыта с ними, но он позволяет проверять время компиляции в других условиях только времени выполнения. – Josh

+0

Я хочу использовать его для отметки объектов, поэтому я уверен, что они имеют какой-то тип, и я читал, что использование пустых интерфейсов - это плохая практика, поэтому я сделал это с атрибутами. Типу ничего не нужно. – slayerIQ

+0

Я не думаю, что пустые интерфейсы - это плохая практика, они идеальное решение для этого. Однако что значит «какого-то типа»? Если объект не должен ничего реализовывать (просто быть помеченным как что-то), что будет с ним делать? –

3

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

NDepend's Code Query Language является статическим инструментом anlysis, который может вероятно обнаружить нарушения - но если вы не используете NDepend, я бы колеблющимся, чтобы включить его в одиночку это требование.

С другой стороны, не хватает контекста того, что вы хотите сделать - это немного похоже на solving the other half your problem.

Смежные вопросы