我有一个带有属性的基类,我想在派生类中隐藏它。除了使用反射之外,还有什么方法可以做到这一点吗?
[Authorize(Roles = "User,Admin,Customs")]
public abstract class ApplicationController : Controller
{
}
// hide the Authorize attribute
public class ErrorController : ApplicationController
{
}
答案 0 :(得分:2)
如果是方法/道具,您可以在没有违规属性的情况下重新声明(new
)该成员。我不知道有关类级属性的方法。
public new SomeType Foo() { return base.Foo(); }
答案 1 :(得分:2)
您可以使用自己的类覆盖AuthorizeAttribute并将其指定为不继承。
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class NonInheritedAuthorizeAttribute : AuthorizeAttribute
{
// Constructors, etc.
}
现在您可以指定要使用的类,只要您拥有ApplicationController。
答案 2 :(得分:2)
删除从基类继承的功能会违反Liskov Substitution Principle。 以这种方式打破继承通常会带来意想不到的意外后果 - 在改变根本问题之后为时已晚。
所以,即使有办法,我也会回答你绝不应该在绝大部分时间都使用它。可以应用继承的替代方法,例如包含( has -a 而不是继承的 is-a )或将基础重构为单独的接口,然后两者都可以实现;甚至将这两者结合起来。
答案 3 :(得分:1)
取决于“隐藏”的含义。你应该能够像这样撤销授权:
// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}
答案 4 :(得分:0)
您可以在Attribute类上指定'AttributeUage'属性,如下所示:
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class AuthorizeAttribute : Attribute
{
}
然后,从您应用该属性的类派生的类将不会继承该属性。
Ow,现在我意识到Authorize属性不是自定义属性。