2013-03-17 14 views
23

Jak uzyskać następujące wartości za pomocą wyliczenia w .NET? Chciałbym mieć opisy dla każdej wartości obejmującej spacje.Jak uzyskać wartości wyliczeniowe ze spacjami?

public enum PersonGender 
    { 
     Unknown = 0, 
     Male = 1, 
     Female = 2, 
     Intersex = 3, 
     Indeterminate = 3, 
     Non Stated = 9, 
     Inadequately Described = 9 
    } 

Chciałbym móc wybrać, czy użyć opis lub całkowitych za każdym razem używam wartość tego typu.

Odpowiedz

37

Nie jest to niemożliwe, ale można dołączyć atrybuty do członków enum. Model EnumMemberAttribute został zaprojektowany dokładnie w określonym celu.

public enum PersonGender 
{ 
    Unknown = 0, 
    Male = 1, 
    Female = 2, 
    Intersex = 3, 
    Indeterminate = 3, 

    [EnumMember(Value = "Not Stated")] 
    NonStated = 9, 

    [EnumMember(Value = "Inadequately Described")] 
    InadequatelyDescribed = 9 
} 

Aby uzyskać więcej informacji na temat sposobu korzystania z EnumMemberAttribute przekonwertować ciągi do enum wartości, patrz this thread.

+0

Czy 'DescriptionAttribute' być wykorzystane? – CJ7

+1

Tak, może. W rzeczywistości można użyć dowolnej klasy atrybutów, która ma "AttributeTargets.Field" lub "AttributeTargets.All". Możesz także napisać własną. Oto przykłady wykorzystujące ['DesciptionAttribute'] (http://tinyurl.com/clqr3ht) i [atrybut niestandardowy] (http://tinyurl.com/cyd2b6q). –

+0

+1 Bardzo wyraźne. Mam jednak pytanie. Otrzymuję komunikat: "Nie można znaleźć nazwy typu lub przestrzeni nazw" EnumMember "... Jak jest ona zawarta w projekcie? Po wyszukiwaniu w Google znalazłem 3 wyniki i żaden z nich nie rozwiązał problemu. – demongolem

4

To jest łatwe. Utwórz metodę rozszerzenia dla łańcucha znaków, która zwraca sformatowany ciąg znaków w oparciu o konwencję kodowania. Możesz go używać w wielu miejscach, a nie tylko tutaj. Ten działa dla camelCase i TitleCase.

public static String ToLabelFormat(this String s) 
    { 
     var newStr = Regex.Replace(s, "(?<=[A-Z])(?=[A-Z][a-z])", " "); 
     newStr = Regex.Replace(newStr, "(?<=[^A-Z])(?=[A-Z])", " "); 
     newStr = Regex.Replace(newStr, "(?<=[A-Za-z])(?=[^A-Za-z])", " "); 

     return newStr; 
    } 
1
var assembly = Assembly.LoadFrom("ResourcesLib.DLL");    
var resourceManager = 
new ResourceManager("ResourcesLib.EnumDescriptions", assembly);       

var lst = Enum.GetValues(typeof(PersonGender)).Cast<PersonGender>().ToList(); 
foreach (var gender in lst) 
{ 
    Console.WriteLine(gender); // Name 
    Console.WriteLine((int)gender); //Int Value 
    Console.WriteLine(resourceManager.GetString(gender.ToString()));//localized Resorce 
}   

Więc pomieszczenia mogą znajdować się w zlokalizowanej zasobu ...