将值从派生的控制器传递到基本控制器中方法的属性

时间:2019-06-27 20:22:30

标签: c# asp.net-mvc attributes asp.net-core-2.0

关于此代码为什么不起作用的问题不是,而是询问是否有任何替代方法可以工作。我了解属性隐藏和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的唯一目的是避免必须在派生类中重新定义任何内容。
  • 做一些摇摆不定的反射性的东西来改变编译时的值,但是我不想走这种方式,因为反射很容易变得晦涩难懂,并使代码难以维护。我已经对该选项进行了相当多的研究,即使有可能,似乎也没有任何“非hacky”方法。

问题:如何在不使用反射或重写派生类中的方法的情况下,将派生时常量从派生类传递给基类中使用的属性。

0 个答案:

没有答案