У меня есть базовый класс с атрибутом, и я хочу скрыть его в производном классе. Там какой-либо путь состоит в том, чтобы сделать это кроме использования отражения?
[Authorize(Roles = "User,Admin,Customs")]
public abstract class ApplicationController : Controller
{
}
// hide the Authorize attribute
public class ErrorController : ApplicationController
{
}
Вы можете переопределить AuthorizeAttribute своим собственным классом и указать, что он не наследуется.
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class NonInheritedAuthorizeAttribute : AuthorizeAttribute
{
// Constructors, etc.
}
Теперь вы можете указать, какой класс использовать, если у вас есть ApplicationController.
.Удаление признаков, унаследованных от базового класса, нарушает принцип замены Лискова . Нарушение наследования таким образом обычно вызывает уродливую голову с непредвиденными и неожиданными последствиями - после того, как слишком поздно менять корневую проблему.
Поэтому, даже если есть способ, я отвечу, что его не следует использовать в подавляющем большинстве случаев. Могут применяться альтернативы наследованию, такие как containment (has-a вместо наследования is-a) или рефакторинг базы в отдельный интерфейс, который оба могут затем реализовать; или даже объединить оба этих способа.
. Если бы это был метод/prop, то можно было бы повторно объявить ( новый
) член без атрибута нарушения. Я не знаю способа с атрибутами уровня класса.
public new SomeType Foo() { return base.Foo(); }
Вы можете указать атрибут 'AttributeUage' на вашем классе атрибутов, например:
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class AuthorizeAttribute : Attribute
{
}
Тогда классы, которые происходят от класса, в котором вы применили атрибут, не будут наследовать атрибут.
Ой, теперь я понимаю, что атрибут Authorize не является пользовательским атрибутом.
Немного зависит от того, что вы имеете в виду под словом «Скрыть». У вас должна быть возможность отозвать авторизацию следующим образом:
// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}