Предел атрибута C # - PullRequest
       19

Предел атрибута C #

2 голосов
/ 22 апреля 2009

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

Ответы [ 3 ]

3 голосов
/ 22 апреля 2009

Во время компиляции №.

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

Если вы думаете о расширяемости, присущей .Net, даже если вы можете проверить это во время компиляции, представьте:

скомпилируйте dll A с

public class Foo 
{
     public int Property1 {get;}
} 

скомпилируйте dll B, ссылающуюся на A.dll с классом

public class Bar
{
     [OnlyOneAllowedOnAnyPropertiesPerClass]
     public int Property2 {get;}
} 

тогда вы перекомпилируете A.dll с

public class Foo 
{
     [OnlyOneAllowedOnAnyPropertiesPerClass]
     public int Property1 {get;}
} 

И попытайтесь запустить этот новый A.dll со старым B.dll (они бинарно совместимы во всех других отношениях, так что это нормально)

Очевидно, что во время выполнения потребуется приложить немало усилий, чтобы проверить это, не говоря уже о том, что B может не загружаться в течение некоторого времени внезапно, делая один или оба из A и B «незаконными».

Поэтому не следует ожидать, что это когда-либо будет функциональностью, доступной в фреймворке.

1 голос
/ 22 апреля 2009

Если это важно во время (или сразу после) компиляции, вы должны создать правило FxCop или пользовательский поиск вашего атрибута (шаблон, например [OnlyOnceAttribute] ).

findstr "[OnlyOnceAttribute]" *.cs

Утилита findstr возвращает совпавшие строки. Вам нужен только командный файл, который перехватывает количество строк и возвращает ошибку для вызывающей стороны (= задача MSBuild), и сборка завершается неудачей.

1 голос
/ 22 апреля 2009

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

...