如何将方法参数传递到方法属性值中?

4

我有一个被ClaimsPrincipalPermissionAttribute修饰的方法,就像这样:

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

有没有办法将ViewTransaction的accountId参数传递给ClaimsPrincipalPermission操作?
我的目标是使用accountId并在ClaimsAuthorizationManager中实现自定义逻辑。

如果accountId作为参数传递到您的ViewTransaction方法中(这意味着accountId必须存在于其他地方),那么为什么不能以同样的方式将其传递到属性中? - panoptical
因为我调用了ViewTransaction(accountId)函数。你说的“以相同的方式传递”是什么意思? - Vu Nguyen
我的意思是,你能否不将accountId作为参数调用到你的属性中,就像你在ViewTransaction方法中所做的那样? - panoptical
抱歉,您是在问我问题吗?ViewTransaction()的accountId由最终用户输入。我想在实际涉及ViewTransaction代码之前将其传递给属性。 - Vu Nguyen
1个回答

4

属性在编译时期需要常量值。因此,您无法传递动态值到属性并期望它能编译通过。您需要使用一些反射技巧来实现所需的功能。

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

你需要为属性公开另一个属性,即AccountId。
显然,这种方法存在一些问题,在执行此操作之前应该仔细考虑。确保您必须将此类型的信息传递给属性。
或者,如果您的方法位于MVC控制器中,则可以从过滤器上下文中访问值提供程序,如此答案所述。
ASP MVC C#: 是否可以将动态值传递到属性中?

我可以看到,如果我尝试这种方式,我必须在具有上述代码的SomeMethod()中调用ViewTransaction。这不是我想做的。所以我认为这没有其他选择,对吗? - Vu Nguyen
1
不,没有其他方法可以真正做到你想做的事情。听起来你可能需要考虑子类化这个功能,而不是将它放在属性中。 - David L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接