c#在派生类中隐藏属性

c#在派生类中隐藏属性,c#,asp.net-mvc,language-design,C#,Asp.net Mvc,Language Design,我有一个带有属性的基类,我想把它隐藏在派生类中。除了使用反射,还有其他方法可以做到这一点吗 [Authorize(Roles = "User,Admin,Customs")] public abstract class ApplicationController : Controller { } // hide the Authorize attribute public class ErrorController : ApplicationController { } 这取决于你所说的“隐

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

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

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

这取决于你所说的“隐藏”是什么意思。您应该能够像这样撤销授权:

// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class AuthorizeAttribute : Attribute
{
}

如果它是一个方法/道具,您可以重新声明(
new
)成员,而不使用有问题的属性。我不知道用类级属性的方法

public new SomeType Foo() { return base.Foo(); }

您可以在属性类上指定“AttributeAge”属性,如下所示:

// hide the Authorize attribute
[Authorize(Roles = "")]
public class ErrorController : ApplicationController
{
}
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
public class AuthorizeAttribute : Attribute
{
}
然后,从应用该属性的类派生的类将不会继承该属性


现在,我意识到Authorize属性不是一个自定义属性。

您可以用自己的类重写authorized属性,并指定它不被继承

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

现在,只要您拥有ApplicationController,就可以指定要使用的类。

删除从基类继承的功能会违反。在改变根本问题为时已晚之后,以这种方式破坏继承通常会带来意想不到的后果


所以,即使有办法,我也会回答,你绝大多数时间都不应该使用它。继承的替代方案可能适用,例如包含(has-a而不是继承的is-a)或将基重构为单独的接口,然后两者都可以实现;或者甚至将这两者结合起来。

出于某种原因,我对这个问题感到困惑。如果这是关于MVC的,那么请将其标记为这样。就像无法通过反射看到基类是用该属性修饰的一样?这不是
System.Web.MVC.AllowAnonymousAttribute
你想要的(ed)?这正是我想要做的(允许非授权人员查看视图)。不幸的是,authorized属性首先检查(!user.Identity.IsAuthenticated),然后验证角色。这就是我想“隐藏”的原因或者只为ErrorController类从基类中删除属性。也许您应该重新考虑继承设计:发明一个新基类并从中派生两个控制器。是的,这是Microsoft团队在System.Web.MVC中创建的一个类。当然,使用基类为站点设置默认授权会很好类。在9个只允许管理员的控制器中,我只有1个。由于似乎不可能删除基类属性,因此这是最合理的建议。我已删除[Authorize(Roles=“User,Admin,Customs”)],我将在每个控制器中设置它。属性与类成员不同,不一定继承(这就是为什么会出现
AttributeUsage(Inherited=false)
)。因此LSP在这里不一定适用。我也考虑过这样做,但我尽量使用Microsoft类,所以我选择从基类中删除Authorize属性并将其添加到每个派生控制器中。+1 for
Inherited=false
,与MVC无关,但确保派生类/方法不尝试修改属性属性。