2016-08-23 4 views
0

"Admin"、 "Moderator"などの文字列値を持つ "Aspnet_Role"テーブルがあります。これらの値の列挙型の表現をしたいと思います。しかし、クラス内で、次のように実際の列挙型を置く:Aspnet_Role.Role.Adminテーブルの型付きの列挙型の表現

public enum Role 
{ 
    None, Admin, Moderator 
} 

は厄介な利用規約を起こします。私はむしろできるはずです:Aspnet_Role.Admin

私は、文字列プロパティのようなものを考えた:

public static string Admin { get { return "Admin"; } } 

その後私は、列挙型の強い型付けの優位性を失います。私のような素敵なヘルパーメソッド作成することができます列挙して、例えば:

public static bool IsUserInRole(Aspnet_Role.Role role){ 
    return System.Web.HttpContext.Current.User.IsInRole(role.ToString()); 
} 

Aspnet_Role.Role命名せずに私のテーブル内の値の強く型付けされた(すなわちなしの文字列)列挙型のような列挙を作成する方法はありますし、使用法?

各値がコード内に1回しか表示されない場合は、非常に好ましいでしょう。列挙型だけでは、そうです。文字列プロパティを使用すると、値ごとに2回になります。列挙型のANDプロパティを使用すると、次のようになります。

public static Role Admin { get { return Role.Admin; 

値ごとに3回になります!綺麗ではない。ああ、Reflectionを提案しないでください。私はあなたがしたいと思う。

+1

は、列挙型はクラスの中で宣言されていますか?名前空間に直接宣言し、 'Aspnet_Role.Role.Admin'の代わりに' Role.Admin'として使用できますか? [クラス名を入力しなくてもEnumを取得する](http://stackoverflow.com/questions/12989636/getting-the-enum-without-having-to-type-its-class-name)を参照してください。 – ConnorsFan

+0

はい!それはうまくいく!私はそれが可能であることを知らなかった! –

答えて

0

ConnersFanさんのコメントを1として、あなたが列挙型を宣言することができます

namespace DataLayer 
{ 
    public enum Role 
    { 
     None, 
     Admin, 
     Etc 
    }; 

    public partial class Aspnet_Role { } 
} 

と同じネームスペースを使用してください。列挙型が何らかの形でAspnet_roleクラスに対応していることを示す何らかの方法があればいいです。おそらく属性を介して?

[Represents(Aspnet_Role)] 
public enum Role { … } 

わかりません。たぶんコメントが良いでしょう。

0

最初は、stringではなく、integerとしてデータベースにその役割を格納します。

しかし、あなたは文字列値で主張すれば、このようなプロパティを作成:あなたはこのようデータベースからそれをロードし、プロパティに割り当てることができたより

public Role UserRole { get; set; } 

string role = // load it here from db 
this.UserRole = (Role)Enum.Parse(typeof(Role), role); 

をしかし、まだそれを格納するintより良いオプションです。

EDIT:

あなたがintとなるだろうならば、私は次のようになりプロパティに割り当てて、あなたをアドバイスとして:

int role = // load it here from db 
this.UserRole = (Role)Enum.ToObject(typeof(Role), role); 
+1

私はあなたが質問のポイントを逃したと思う、opは 'AspNet_Role.Role ... 'を書くことを避けたいと思う。あなたのソリューションはこれを修正しません。 – ViRuSTriNiTy

+0

あなたのコードで 'Role'と' UserRole'とは何ですか?私は 'Aspnet_Role'しか持っていません。 intについては、これはレガシーシステムです。私はあまり変更したくありません。新しいコードがこれまでよりも優れていることを確認してください。 –

+0

私が右のIDを理解していれば、このようにしてください: 'public static Role Admin {get {return Role.Admin; }} ' しかし、私はこの点を見ません。 –

0

タイプセーフ列挙型の単なる例:

public class Aspnet_Role 
{ 
    public static readonly Aspnet_Role None = new Aspnet_Role(Roles.None, "None"); 
    public static readonly Aspnet_Role Admin = new Aspnet_Role(Roles.Admin, "Admin"); 
    public static readonly Aspnet_Role Moderator = new Aspnet_Role(Roles.Moderator, "Moderator"); 

    private Aspnet_Role(Roles role, string name) 
    { 
     Role = role; 
     Name = name; 
    } 

    public enum Roles 
    { 
     None, 
     Admin, 
     Moderator 
    } 

    public Roles Role { get; private set; } 
    public string Name { get; private set; } 

    public Aspnet_Role Parse(Roles role) 
    { 
     switch(role) 
     { 
      case Roles.Moderator: 
       return Moderator; 
      case Roles.Admin: 
       return Admin; 
      case Roles.None: 
      default: 
       return None; 
     } 
    } 

    public bool IsUserInRole(Aspnet_Role role) 
    { 
     return Role == role.Role; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj is Aspnet_Role) 
     { 
      return Role == ((Aspnet_Role)obj).Role; 
     } 
     return false; 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 
+0

これは興味深いアプローチですが、私は本当にそれぞれの可能な値がどのようにコード内に_five_回記述されているか気に入らないのです。私は使用法の可愛さがコードレビューの定型文の醜さに重くなることを疑う。 –

+0

はい、それは過剰です。私は通常、元の列挙型の拡張として、値として整数だけを使用することができます。 – kurakura88