2014-02-21 2 views
1

У меня есть метод, который украшен ClaimsPrincipalPermissionAttribute так:Как передать параметр метода в значение атрибута метода?

[ClaimsPrincipalPermission(SecurityAction.Demand, 
          Resource = "User", 
          Operation = "accountId")] 
IList<Transaction> ViewTransaction(int accountId) 
{ 
    // some code 
} 

есть в любом случае, чтобы передать параметр accoutId из ViewTransaction к ClaimsPrincipalPermission операции?

Я хочу использовать accountId, а затем реализовать пользовательскую логику внутри ClaimsAuthorizationManager.

+0

Если ACCOUNTID настоящее время передается в качестве параметра в ваш метод ViewTransaction (что означает, что ACCOUNTID должен существовать где-то еще), почему она не может быть передана таким же образом, в атрибуте? – panoptical

+0

Потому что я вызываю ViewTransaction (accountId). Что значит «прошел так же»? –

+0

Что я имел в виду, так это то, что вы не могли бы вызвать accountId в качестве параметра в своем атрибуте, подобно тому, как вы это делаете с помощью метода ViewTransaction? – panoptical

ответ

2

Атрибуты ожидают постоянные значения во время компиляции. В результате вы не можете передавать динамические значения в свой атрибут и ожидать его компиляции. Вам нужно прибегнуть к некоторым размышлениям, чтобы заставить это делать то, что вы хотели бы сделать.

var method = typeof(YourClassType).GetMethod("ViewTransaction"); 
var attribute = method.GetCustomAttribute(typeof(ClaimsPrincipalPermission)) as ClaimsPrincipalPermission; 
attribute.AccountId = 1234; 

Вам нужно будет открыть другое свойство для вашего атрибута, а именно AccountId.
Существует определенная озабоченность в отношении такого подхода, и перед этим следует серьезно взвесить. Убедитесь, что вы должны передать этот тип информации вашему атрибуту.

В качестве альтернативы, если ваш метод находится внутри контроллера MVC, вы можете получить доступ к поставщику значений из контекста фильтра, как объяснено в этом ответе.

ASP MVC C#: Is it possible to pass dynamic values into an attribute?

+0

Я вижу, что если я попытаюсь таким образом, я должен вызвать ViewTransaction в SomeMethod(), который имеет код выше. Это не то, что я хочу сделать. Так что я не хочу этого делать, правда? –

+1

Нет, нет другого способа действительно делать то, что вы пытаетесь сделать. Похоже, вам, возможно, придется заглянуть в подклассификацию этой функции вместо того, чтобы поместить ее в атрибут. –

+0

Хорошо, спасибо за вашу помощь. –

Смежные вопросы