c# скрывают Атрибут в производном классе

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

[Authorize(Roles = "User,Admin,Customs")]
public abstract class ApplicationController : Controller
{
}

// hide the Authorize attribute
public class ErrorController : ApplicationController
{
}
6
задан PaulN 7 January 2010 в 21:54
поделиться

5 ответов

Вы можете переопределить AuthorizeAttribute своим собственным классом и указать, что он не наследуется.

[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class NonInheritedAuthorizeAttribute : AuthorizeAttribute
{
    // Constructors, etc.
}

Теперь вы можете указать, какой класс использовать, если у вас есть ApplicationController.

.
2
ответ дан 17 December 2019 в 00:10
поделиться

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

Поэтому, даже если есть способ, я отвечу, что его не следует использовать в подавляющем большинстве случаев. Могут применяться альтернативы наследованию, такие как containment (has-a вместо наследования is-a) или рефакторинг базы в отдельный интерфейс, который оба могут затем реализовать; или даже объединить оба этих способа.

.
2
ответ дан 17 December 2019 в 00:10
поделиться

Если бы это был метод/prop, то можно было бы повторно объявить ( новый) член без атрибута нарушения. Я не знаю способа с атрибутами уровня класса.

public new SomeType Foo() { return base.Foo(); }
2
ответ дан 17 December 2019 в 00:10
поделиться

Вы можете указать атрибут 'AttributeUage' на вашем классе атрибутов, например:

[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class AuthorizeAttribute : Attribute
{
}

Тогда классы, которые происходят от класса, в котором вы применили атрибут, не будут наследовать атрибут.

Ой, теперь я понимаю, что атрибут Authorize не является пользовательским атрибутом.

0
ответ дан 17 December 2019 в 00:10
поделиться

Немного зависит от того, что вы имеете в виду под словом «Скрыть». У вас должна быть возможность отозвать авторизацию следующим образом:

// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}
1
ответ дан 17 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: