Dize

2009-07-27 18 views
32

ben gibi bazı girişler görüntüleyerek am bir açılan kutu var. uzayda yanaDize

enum Operation{Equals, Not_Equals, Less_Than, Greater_Than}; 

izin verilmez, ben kullandım _ karakteri: Ben gibi bu girişlere maçları tanımlanan bir enum var.

Şimdi, verilen dizgiyi otomatik olarak bir enum öğesine otomatik olarak bir döngü yazmadan veya koşulların bir setini C# 'de kendi koşuluma dönüştürmeden dönüştürmenin bir yolu var mı?

+0

şiddetle ilgili: [nasıl yapılır set-space-on-enum] (http://stackoverflow.com/questions/1101872/how-to-set-space-on-enum) – nawfal

+1

Sözlüğe ek olarak aşağıdakine yaklaştığınızda, meta verileri (görüntü dizileri gibi) bir numarayla ilişkilendirmek için öznitelikleri kullanabilirsiniz. [C# enums in ins ve out] 'a göz atın (http://www.codeducky.org/ins-outs-c-enums/). – ChaseMedallion

cevap

67

Kullanıcı dostu adları enum sabitlerine eşlemek ve öğelerin kendisindeki normal adlandırma kurallarını kullanmak için Dictionary<string, Operation> oluşturmanızı öneririm.

var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_')); 
+1

İlgi dışı, neden Enum.Parse'i kullanmayacağınızı öneriyorsunuz? daha fazla dönüşüm – Pondidum

+15

Enum.Parse' yöntemine karşı değilim. Kullanıcı arayüz dizelerini kod elemanlarına sıkı sıkıya bağlıyorum (ve ekran isimlerine göre kodu değiştiriyorum). –

18

Ya (Mehrdad en Yanıt başına) bir sözlük kullanarak özel bir mapper oluşturmak: Eğer mevcut yönteme sadık istiyorsanız

enum Operation{ Equals, NotEquals, LessThan, GreaterThan }; 

var dict = new Dictionary<string, Operation> { 
    { "Equals", Operation.Equals }, 
    { "Not Equals", Operation.NotEquals }, 
    { "Less Than", Operation.LessThan }, 
    { "Greater Than", Operation.GreaterThan } 
}; 

var op = dict[str]; 

Alternatif olarak, (yaptığımı karşı tavsiye) yapabilirsiniz veya bir TypeConverter uygulayın.

Özel TypeConverter'ınız " " -> "_"'u (ya da tam tersi) değiştirebilir ya da numaralandırmayı yansıtabilir ve öğenin görünen metnini belirlemek için bir öznitelik kullanabilir.

enum Operation 
{ 
    [DisplayName("Equals")] 
    Equals, 

    [DisplayName("Not Equals")] 
    Not_Equals, 

    [DisplayName("Less Than")] 
    Less_Than, 

    [DisplayName("Greater Than")] 
    Greater_Than 
}; 

public class OperationTypeConverter : TypeConverter 
{ 
    private static Dictionary<string, Operation> operationMap; 

    static OperationTypeConverter() 
    { 
     BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField 
      | BindingFlags.Public; 

     operationMap = enumType.GetFields(bindingFlags).ToDictionary(
      c => GetDisplayName(c) 
      ); 
    } 

    private static string GetDisplayName(FieldInfo field, Type enumType) 
    { 
     DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute)); 

     return (attr != null) ? attr.DisplayName : field.Name; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string stringValue = value as string; 

     if (stringValue != null) 
     { 
      Operation operation; 
      if (operationMap.TryGetValue(stringValue, out operation)) 
      { 
       return operation; 
      } 
      else 
      { 
       throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation"); 
      } 
     } 
    } 
} 

Bu uygulama çeşitli şekillerde geliştirilebilir:

+0

Eksik bir şey var gibi görünüyor ... enumType hiçbir zaman bildirilmez, GetDisplayName bir parametre ile çağırıyor ancak bildirilen 2 parametresi var. –

+0

Düzeltme: enumType hiçbir zaman statik yapıcıda bildirilmez –

+4

enum bildirimlerinde DisplayName özniteliğini kullanamazsınız –

19
Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals") 

Uygulamak olun sen rv ihtiyacım var Yukarıdaki açıklamada alt çizgilerle eplace alanlarda

DÜZENLEME:

Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals"); 

Bazı örnekler:

string someInputText; 
var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_")); 
+0

Bu "Eşit Olmayanlar" ile Çalışmaya eşleşmiyor.Not_Equals –

+0

Bu, alt boşluklarla yer değiştirmek için değerde bir değişiklik yapmanız gerektiğini söyledim, böylece eşleşecek ... – AdaTheDev

9

Sen Ayrıştırma yöntemi kullanabilirsiniz: Aşağıdaki sürüm ayrıştırma başlamadan önce alt çizgilerle boşlukları değiştirir here

0

Neden başka bir yol kullanıyorsunuz: Numaralandırmayı String'e dönüştürün?

Numaralandırma sayfanızdan açılan kutunuzun öğelerini oluşturmanız yeterlidir. C# 'de

0

, enum türlerine uzatma yöntemleri ekleyebilirsiniz. http://msdn.microsoft.com/en-us/library/bb383974.aspx

Sen enum türlerine toString (Operasyon op), fromString (String str) ve toLocalizedString (Operasyon op) yöntemlerini eklemek için bu yaklaşımı kullanabilirsiniz bakın.Belirli bir dizeyi aramak için kullandığınız yöntem, uygulamanıza bağlıdır ve benzer durumlarda yaptığınız şeyle tutarlı olmalıdır. Diğerleri gibi bir sözlük kullanmak, uygulamanızda tam yerelleştirmeye ihtiyacınız olmadıkça iyi bir ilk yaklaşım gibi görünüyor.

0

Bu enum mapper class numaralı bir tekli kullanarak Enum.Parse'den daha hızlı performans gösterir (yansıma kullanır ve gerçekten yavaştır). Daha sonra enum'unuzu almak için EnumFromString(typeof(YourEnum), "stringValue")'u kullanabilirsiniz.