2012-08-29 14 views
6

属性ごとに「マネージャ」を使用せず、そのためにいくつかの列挙型を使用したいだけです。属性パラメータのようにenum項目名を使用する

しかし、それは不可能か、間違っているようですか?

だから私は

[RequiresRole(HardCodedRoles.Managers.ToString())] 

... 

public enum HardCodedRoles 
{ 
      Administrators, 
      Managers 
} 
+1

私たちは、それはあなたが達成しようとしているのが何であるかを知っているように、あなたはより詳細な情報を追加してもらえますか? – Maciej

+0

文字列 "AnyRoleName"を使いたくないので、代わりに列挙型の項目を入れたいと思います。しかし、VSにはエラーがあります。属性引数は定数式、typeof式、または属性パラメータータイプ –

+1

の配列作成式でなければなりません。これはHardcodedRoles.Managersがconst文字列の場合に有効です。一方、HardcodedRolesが列挙型の場合、AuthorizeAttributeをサブクラス化し、独自に実装し、HardcodedRolesやHardcodedRoles []をコンストラクタに渡す必要があります。 – Maciej

答えて

11

どう代わりに列挙型のクラスについてクラスを静的にして誰かが新しいのを避けるようにする:

public static class HardCodedRoles 
{ 
    public const string Managers = "Managers"; 
    public const string Administrators = "Administrators"; 
} 

[RequiresRole(HardCodedRoles.Managers)] 
+0

うん!!!これは解決策です!!!!畜生!容易いものだ!!! :))) –

+1

誰かが '[RequiresRole(" fred ")]'を使うことを制限しません。それで十分ですか? –

2

あなたはToString()方法であるため、値がコンパイル時に計算することができないため、エラーがある参照の理由で

[RequiresRole("Managers")] 

を交換してみてください。

代わりに[RequiresRole(HardCodedRoles.Managers)]を使用できる場合は、コード内の別の場所でToStringを実行すると、必要な機能が得られる可能性があります。これには、属性のパラメータをstringからHardCodedRolesに変更する必要があります。

(入力が制限されることはありませんので、パラメータの種類はまだ、stringになりますので、私は、constを使用して動作しないことを想像。)

+1

ありがとうございます! [RequiresRole(HardCodedRoles.Managers)]を代わりに使用できる場合は、代わりにコード内のToStringを実行して、必要な機能を提供できるというサンプルを提供してください。 –

+0

サンプルが必要ですの? –

+0

ありがとうございました!私はすでに答えを得ている。 –

1

また、すなわち、がNameOfキーワードを使用することができます。:

[RequiresRole(nameof(HardCodedRoles.Managers))] 
関連する問題