2010-06-05 30 views
9

enum tanımlamak için herhangi bir yolu var C# aşağıda gibi?dize değerleri enum C#

public static bool IsValidDescription(string description) 
{ 
    var enumType = typeof(Culture); 
    foreach (Enum val in Enum.GetValues(enumType)) 
    { 
     FieldInfo fi = enumType.GetField(val.ToString()); 
     AmbientValueAttribute[] attributes = (AmbientValueAttribute[])fi.GetCustomAttributes(typeof(AmbientValueAttribute), false); 
     AmbientValueAttribute attr = attributes[0]; 
     if (attr.Value.ToString() == description) 
      return true; 
    } 
    return false; 
} 

herhangi bir iyileşme:

public enum MyEnum : string 
{ 
    EnGb = "en-gb", 
    FaIr = "fa-ir", 
    ... 
} 

Tamam, erick yaklaşımı ve bağlantı göre, ben bu tariften geçerli değerini kontrol etmek kullanıyorum?

+0

Cevaplardan da görebileceğiniz gibi ... C# 'da enum desteği, temel özelliklerin ötesinde, özellikle de C veya C++ dünyasından gelen eksiklikler. Onların gerçekten yapmak istemedikleri bir şeyi yapmalarını sağlamak için çok fazla zaman harcamayın. Ben yaptım, bu yüzden sende de yok :) Bu özel senaryoda – Rusty

cevap

13

diğer alternatif, enum işlevselliğini veren böyle bir özellik kullanmak için verimli ama değil bunu şu şekilde çağırabilir:

MyEnum.EnGb.GetDescription() 

Eğer bir açıklama özelliği varsa, öyle değil, .ToString() sürümünü, ör. "EnGb". Bunun gibi bir şeye sahip olmamızın sebebi, doğrudan bir Linq-to-SQL nesnesinde bir enum türünü kullanmaktır, ancak UI'de güzel bir açıklama gösterebilmektir. Durumunuza uyduğundan emin değilim, ama bir seçenek olarak oraya atıyorum.

+0

Aynı fikir ve ben bir dakika daha hızlı oldu, ama cevabınız daha eksiksiz ...;-) – Lucero

+0

@Lucero: Proje dosyalarını açmak için bir dakikanızı ayırın;) –

+0

@Nick, Tahminimce. Bu hatayı kullanmadan yazmanın bir dakika daha süreceği ve elimde bir örnek olmadığı için "konsept" ini yazdım. Perfomance-wise birinin, enum değerlerini dizelerine eşleyen bir sözlük eklemek isteyebileceğini unutmayın, bu gerçekten sorun değil. – Lucero

1

Hayır. Dictionary<String, String>'u kullanabilirsiniz. Bir enumun türü, char'dan farklı bir tür olmalı. Bu yüzden verimli bir şekilde karşılaştırılabilir.

3

Tüm adlarınız/değerleriniz tam olarak böyle olacaksa, normal olarak bir numara oluşturabilirsiniz.

public enum MyEnum 
{ 
    EnGb 
    FaIr 
} 

Ve gerçek değerini gerektiğinde daha sonra, bir dize olarak enum adını almak o küçük harfe ve ortasında bir - eklemek olun. Eğer Dictionary<MyEnum, String> kullanmak Matthew cevap İlişkin

string value = MyEnum.EnGb.ToString().ToLower().Insert(2, "-"); 
+0

Gud cevabı. – shashwat

7

, ben öneririz.

public enum MyEnum { 
    [DefaultValue("en-gb")] 
    EnGb, 
    [DefaultValue("fa-ir")] 
    FaIr, 
    ... 
} 

Daha sonra yansıma kullanarak dize değeri alabilir okuyarak:

class MyClass 
{ 
    private static readonly IDictionary<MyEnum, String> dic = new Dictionary<MyEnum, String> 
    { 
     { MyEnum.EnGb, "en-gb" }, 
     { MyEnum.RuRu, "ru-ru" }, 
     ... 
    }; 

    public static IDictionary<MyEnum, String> Dic { get { return dic; } } 
} 
+1

Bu, orijinal değerler (EnGb' vb.) Uygulama çevresinde geçirilecekse yararlıdır. Yine de, Sözlük alma kamuoyunu yapmaya dikkat etmelisiniz. Bir 'salt okunur' referansınız olsa bile, Sözlüğün kendisi değiştirilebilir. –

+1

@Matthew: Bahşişiniz için teşekkürler! Burada bazı geçici çözümler var: http://stackoverflow.com/questions/678379/is-there-a-read-only-generic-dictionary-available-in-net. Ayrıca başka bir w/o - özelliği 'dahili' yapmak için – abatishchev

1

O kadar olduğu gibi, enum değerleri üzerinde özelliklerini kullanarak dolaylı mümkündür: Ben statik özellik olarak kullanabilirsiniz Enum'un statik alanlarındaki özel nitelikler. Ne kullanın

public enum MyEnum 
{ 
    [Description("en-gb")] 
    EnGb, 
    [Description("fa-ir")] 
    FaIr, 
    ... 
} 

Ve bir uzantısı yöntemiyle gibi bir şey, burada var:

public static string GetDescription<T>(this T enumerationValue) where T : struct 
{ 
    var type = enumerationValue.GetType(); 
    if (!type.IsEnum) throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue"); 
    var str = enumerationValue.ToString(); 
    var memberInfo = type.GetMember(str); 
    if (memberInfo != null && memberInfo.Length > 0) 
    { 
    var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 
    if (attrs != null && attrs.Length > 0) 
     return ((DescriptionAttribute) attrs[0]).Description; 
    } 
    return str; 
} 

Sonra sizi