2013-12-16 63 views
9

我與當前正在使用的數據庫有一個varchar領域,我的代碼,我想可能值映射到像一個枚舉:是否可以保證枚舉的ToString值是多少?

public enum UserStatus 
{ 
    Anonymous, 
    Enrolled, 
    SuperUser 
} 

在此列的數據庫級,有一個約束上這其中值必須是:

ANONYMOUS 
ENROLLED 
SUPERUSER 

是否有可能爲我做的:

UserStatus.SuperUser.ToString() 

而且具有價值是超級用戶,這可以由螞蟻,而不是砸在路上?

+1

如果你在控制代碼庫,那麼確定你可以確保。 –

+1

['ToUpperInvariant()'](http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant(v = vs.110).aspx)? – PoByBolek

+1

你甚至可能不需要這個。你沒有指定你的SQL方言,但是其中的許多默認情況下對文本是不區分大小寫的,這意味着「SuperUser」會滿足約束條件。 – hvd

回答

6

不能覆蓋ToString的枚舉,而不是你可以創建自己的Extension Method這樣的:

public static class MyExtensions 
{ 
    public static string ToUpperString(this UserStatus userStatus) 
    { 
     return userStatus.ToString().ToUpper();// OR .ToUpperInvariant 
    } 
} 

然後調用它像:

string str = UserStatus.Anonymous.ToUpperString(); 
+0

Will ToUpperInvariant()不起作用? – loyalflow

+0

@ user1361315,這是爲文化不敏感轉換爲大寫。看到[這](http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant(v = vs.110).aspx) – Habib

+0

嗯,我不關心文化,它只是爲了數據庫,所以它不應該由文化改變。那麼使用ToUpperInvariant呢? – loyalflow

7

一個更好的解決方案可能是利用的DescriptionAttribute

public enum UserStatus 
{ 
    [Description("ANONYMOUS")] 
    Anonymous, 
    [Description("ENROLLED")] 
    Enrolled, 
    [Description("SUPERUSER")] 
    SuperUser 
} 

然後使用像這樣:

/// <summary> 
/// Class EnumExtenions 
/// </summary> 
public static class EnumExtenions 
{ 
    /// <summary> 
    /// Gets the description. 
    /// </summary> 
    /// <param name="e">The e.</param> 
    /// <returns>String.</returns> 
    public static String GetDescription(this Enum e) 
    { 
     String enumAsString = e.ToString(); 
     Type type = e.GetType(); 
     MemberInfo[] members = type.GetMember(enumAsString); 
     if (members != null && members.Length > 0) 
     { 
      Object[] attributes = members[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 
      if (attributes != null && attributes.Length > 0) 
      { 
       enumAsString = ((DescriptionAttribute)attributes[0]).Description; 
      } 
     } 
     return enumAsString; 
    } 

    /// <summary> 
    /// Gets an enum from its description. 
    /// </summary> 
    /// <typeparam name="TEnum">The type of the T enum.</typeparam> 
    /// <param name="description">The description.</param> 
    /// <returns>Matching enum value.</returns> 
    /// <exception cref="System.InvalidOperationException"></exception> 
    public static TEnum GetFromDescription<TEnum>(String description) 
     where TEnum : struct, IConvertible // http://stackoverflow.com/a/79903/298053 
    { 
     if (!typeof(TEnum).IsEnum) 
     { 
      throw new InvalidOperationException(); 
     } 
     foreach (FieldInfo field in typeof(TEnum).GetFields()) 
     { 
      DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; 
      if (attribute != null) 
      { 
       if (attribute.Description == description) 
       { 
        return (TEnum)field.GetValue(null); 
       } 
      } 
      else 
      { 
       if (field.Name == description) 
       { 
        return (TEnum)field.GetValue(null); 
       } 
      } 
     } 
     return default(TEnum); 
    } 
} 

所以現在你參考UserStatus.Anonymous.GetDescription()

當然,您可以隨時製作自己的DatabaseMapAttribute(或您有什麼),並創建自己的擴展方法。然後你可以殺死對System.ComponentModel的引用。完全是你的電話。

+0

如果將其定義爲GetDescription(),則必須將其稱爲GetDescription(),而不是「ToDescription()」:) – hvd

+0

@ hvd:良好的調用。還在經歷一個星期一。 ;-) –

+2

這真的好嗎?從代碼數量來看,您必須維護我更喜歡Habib的解決方案... – PoByBolek

1

Enum.ToString支持4 different formats。我會去:

UserStatus.SuperUser.ToString("G").ToUpper(); 

「G」確保它會先嚐試獲取您的枚舉的字符串表示形式。

相關問題