c # скрыть атрибут в производном классе - PullRequest
6 голосов
/ 08 января 2010

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

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

// hide the Authorize attribute
public class ErrorController : ApplicationController
{
}

Ответы [ 5 ]

2 голосов
/ 08 января 2010

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

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

2 голосов
/ 08 января 2010

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

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

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

2 голосов
/ 08 января 2010

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

public new SomeType Foo() { return base.Foo(); }
1 голос
/ 08 января 2010

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

// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}
0 голосов
/ 08 января 2010

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

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

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

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

...