关于此代码为什么不起作用的问题不是,而是询问是否有任何替代方法可以工作。我了解属性隐藏和new
关键字的行为。
在基本控制器中,我定义了一个带有带有字符串参数的filter属性的方法。我希望传递给属性的值在派生类中定义。属性需要编译时常量,这迫使我使用const
属性,禁止任何形式的重载/覆盖。
这是我最终编写的代码。可悲的是,new
关键字仅将属性隐藏在派生类中,而不会影响基类。
观察到的行为:按下DerivedController.DoSomething
动作后,AttributeThatNeedsProperty
参数的激活值为property
参数值为valueToOverride
(从BaseController
类)
期望的行为:点击DerivedController.DoSomething
动作后,AttributeThatNeedsProperty
属性被激活,且property
参数的值为 {{1} }(来自overridenValue
类)
DerivedController
我想到了两个解决方案,我都不喜欢:
// Note: This code certainly won't compile, it's a quick reproduction of my setup meant to hide the implementation detail noise from my actual code. Still, it should include all the elements needed to understand the question. If not, please ask for clarification
public abstract class BaseController : Controller
{
public const string PropertyToOverride = "valueToOverride";
[AttributeThatNeedsProperty(PropertyToOverride)]
public IActionResult DoSomething()
{
}
}
public class DerivedController : BaseController
{
public new const string PropertyToOverride = "overridenValue";
}
public class AttributeThatNeedsProperty : Attribute, IAuthorizationFilter
{
private string _property;
public AttributeThatNeedsProperty(string property)
{
_property = property;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
// [...]
}
}
方法。我不想这样,因为DoSomething
的唯一目的是避免必须在派生类中重新定义任何内容。问题:如何在不使用反射或重写派生类中的方法的情况下,将派生时常量从派生类传递给基类中使用的属性。