15

AuthoriseAttribute というカスタム属性があり、そのコンストラクターは次のようになります。

public AuthoriseAttribute(int userId)
{
  .. blah
}

GetUserDetails()これは、次のように呼び出されるメソッドで使用されます。

[Authorise(????????)]
public UserDetailsDto GetUserDetails(int userId)
{
  .. blah
}

実行時に Authorize 属性が存在すると、ユーザーの ID を必要とする認証コードが実行されます。明らかに、これはメソッドのパラメーターから抽出できますが、GetUserDetails()これは、認証コードが、特定の名前が付けられたメソッドのパラメーターに依存することを意味します。

パラメータの実際の値を属性に渡すことができるようにしたいと考えuserIdています。これにより、名前がわかっている属性に渡された値 (つまり、メソッド パラメータではない) で認証コードが機能します。

このようなもの(機能しません):

[Authorise(userId)]
public UserDetailsDto GetUserDetails(int userId)
{
  .. blah
}

そのようなことは可能ですか?

4

4 に答える 4

21

_ASP.NET MVC_でアクション メソッドを使用してこれを行う方法があります (一般的には属性を使用しません)。

public class CustomAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        int userId = (int)filterContext.ActionParameters["userId"];
    }
}
于 2014-12-05T22:26:23.240 に答える
17

vcsjones のコメントを回答にすると、これは不可能です。

属性はメタデータです。これらはコンパイル時にアセンブリにコンパイルされ、実行時に変更されません。そのため、属性に渡すパラメーターはすべて定数でなければなりません。リテラル、定数変数、コンパイラ定義など。

これが機能する 1 つの方法は、PostSharp などのフレームワークを使用するか、Unity Framework などを使用して独自のフレームワークを使用して、属性を AOP 要素にすることです。これにより、属性でコードが実行され、パラメーター値を含むメソッドがどのように呼び出されたかについての正確な情報も得られます。このブログをチェックしてください: http://www.progware.org/Blog/post/Interception-and-Interceptors-in-C-(Aspect-directional-programming).aspx

于 2012-05-03T16:31:00.243 に答える