如何从装饰方法内部获取装饰器对象

时间:2015-07-23 19:22:34

标签: c# asp.net-mvc-4

在我的ASP.NET MVC 4控制器类中,我有使用CustomAuthorize属性修饰的操作,因此访问仅限于某些角色。

我想从动作方法中获取角色,为此我需要使用方法装饰的CustomAuthorize属性。

我该怎么做?

我想要做的示例代码如下:

public class TestController : Controller
{
    // Only the users in viewer and admin roles should do this
    [CustomAuthorize("viewer", "admin")]
    public ActionResult Index()
    {
        //Need CustomAuthorizeAttribute so I get the associated roles
    }
}

CustomAuthorizeAttributeSystem.Web.Mvc.AuthorizeAttribute的子类。

3 个答案:

答案 0 :(得分:2)

属性不是每个实例,它们是每个类,因此没有CustomAuthorizeAttribute的“当前”实例。请参阅有关属性的文档。

https://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

如果您需要获取CustomAuthorizeAttribute,可以使用reflection获取有关您所在类的信息,然后提取属性的属性,但我会质疑您需要的原因。是否有您想要的具体内容我们可以提供更多帮助?

答案 1 :(得分:2)

如果你想从该方法获取属性,你可以这样做,例如使用反射:

var atrb = typeof(TestController).GetMethod("Index")
             .GetCustomAttributes(typeof(CustomAuthorizeAttribute), true)
             .FirstOrDefault() as CustomAuthorizeAttribute;

或当前方法;

var atrbCurrentMethod = System.Reflection.MethodBase.GetCurrentMethod()
                .GetCustomAttributes(typeof(CustomAuthorizeAttribute), true)
                .FirstOrDefault() as CustomAuthorizeAttribute;

或更灵活的方式,如果您想稍后创建一个功能,如您在评论中所述:

public CustomAuthorizeAttribute GetCustomAuthorizeAttribute() {
            return new StackTrace().GetFrame(1).GetMethod()
                .GetCustomAttributes(typeof(CustomAuthorizeAttribute), true).FirstOrDefault() as CustomAuthorizeAttribute;
        }

答案 2 :(得分:0)

为什么不使用Roles.GetRolesForUser();方法来获取所有角色用户?这应该与您从Reflection解析属性值得到的结果相同。