c#隐藏派生类中的属性

时间:2010-01-07 21:33:47

标签: c# asp.net-mvc language-design

我有一个带有属性的基类,我想在派生类中隐藏它。除了使用反射之外,还有什么方法可以做到这一点吗?

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

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

5 个答案:

答案 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属性不是自定义属性。