根据实现的接口对控制器方法应用NonAction



这是我的同步控制器,它允许推送和/或拉数据。

public class SyncController : MyController
{
ISyncable _sync;
public SyncController(ISyncable sync) { _sync = sync; }
[HttpPost, PullAction]
public async Task<IActionResult> pull()
{
(_sync as IPullable).Pull();
}
[HttpPost, PushAction]
public async Task<IActionResult> push()
{
(_sync as IPushable).Push();
}
}

如果ISyncable实现IPushable,控制器应提供push方法。

如果ISyncable实现IPullable,控制器应提供pull方法。

所以我想根据实现的接口应用[NonAction]属性。

我打算用自定义属性来做:

[AttributeUsage(validOn: AttributeTargets.Method, AllowMultiple = false)]
public class PushActionAttribute : Attribute
{
public PushActionAttribute([CallerMemberName] string propertyName = null)
{
Type syncType = ???;  // TODO get ISyncable type from propertyName
bool isPushable = typeof(IPushable).IsAssignableFrom(syncType);
if(!isPushable)
{
// TODO apply NonActionAttribute
}
}
}
[AttributeUsage(validOn: AttributeTargets.Method, AllowMultiple = false)]
public class PullActionAttribute : Attribute
{
public PullActionAttribute([CallerMemberName] string propertyName = null)
{
Type syncType = ???;  // TODO get ISyncable type from propertyName
bool isPullable = typeof(IPullable).IsAssignableFrom(syncType);
if(!isPullable)
{
// TODO apply NonActionAttribute
}
}
}

是否可以从属性目标检索syncType ?

是否可以动态应用[NonAction]属性?

有没有更好的方法来实现这个功能?

你可以简单地做:

if (_sync is IPullable) (_sync as IPullable).Pull();

?没有增加反射、属性和其他样板的复杂性。我不认为有一种动态/运行时的方式来添加禁用方法的属性。

如果失败,您可以返回NotFound,例如

[HttpPost]
public IActionResult push()
{
if (_sync is IPushable) (_sync as IPushable).Push();
else return NotFound();
return View();
}

(删除async Task,因为没有await或返回Task)…

相关内容

  • 没有找到相关文章

最新更新