这是我的同步控制器,它允许推送和/或拉数据。
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
)…