2013-03-05 15 views
11

Próbowałem skonfigurować wyliczenie, które ma spacje w atrybutach, ale było bardzo trudne, więc wymyśliło, że może to być łatwy sposób na zhackowanie tego za pomocą formatu ciągów lub czegoś, ponieważ jest to tylko jeden element, który Potrzebuję przestrzeni i dokładnie wiem, co to jest. Wszelkie pomoc wnioskach dodanie miejsca do tego łańcuchaDodaj spację w tym ciągu między słowami

public class Address 
{ 
...blah...more class datatypes here... 

public AddressType Type { get; set; } //AddressType is an enum 

...blah.... 
} 



if (Address.Type.ToString() == "UnitedStates") 
     { 
      **Add space between United and States** 
     } 

Odpowiedz

5

Możesz stworzyć swoją własną metodę ToString na wyliczenie stosując metodę rozszerzenia.

public static class AddressTypeExtensions 
{ 
    public static string ToMyString(this AddressType addressType) 
    { 
      if (addressType == AddressType.UnitedStates) 
       return "United States"; 

      return addressType.ToString(); 
    } 
} 
12

Jeśli wpisy enum są w przypadku wielbłądów, można wstawić spacje przed górnym listu

string res = Regex.Replace("UnitedStates", "[A-Z]", " $0").Trim(); 
+0

Czy to będzie działać na "UnitedArabEmirates"? :) –

+0

@DanJ pewnie, spróbuj – VladL

+1

Ah, tak. Umieszcza spację przed każdym tokenem, stąd Trim. –

1

Mam przydatna metoda rozszerzenie dla tej właśnie

public static class EnumExtensions 
{ 
    public static string ToNonPascalString(this Enum enu) 
    { 
     return Regex.Replace(enu.ToString(), "([A-Z])", " $1").Trim(); 
    } 

    public T EnumFromString<T>(string value) where T : struct 
    { 
     string noSpace = value.Replace(" ", ""); 
     if (Enum.GetNames(typeof(T)).Any(x => x.ToString().Equals(noSpace))) 
     { 
      return (T)Enum.Parse(typeof(T), noSpace); 
     } 
     return default(T); 
    } 

} 

przykładu:

public enum Test 
{ 
    UnitedStates, 
    NewZealand 
} 

// from enum to string 
string result = Test.UnitedStates.ToNonPascalString(); // United States 

// from string to enum 
Test myEnum = EnumExtensions.EnumFromString<Test>("New Zealand"); // NewZealand 
+0

FWIW Uważam, że ta metoda jest dokładnym * przeciwieństwem * "ToPascalString". :) – Brandon

+0

LOL, dobra uwaga, nigdy tak naprawdę nie myślałem o tym, powinienem to zmienić, byłem w mojej bibliotece od lat LOL –

+0

Dodano do iz metod –

2

Jest to fajna sztuczka, którą znalazłem wczoraj (w 2009 roku). Zastanawiam się, dlaczego sam nigdy o tym nie pomyślałem. W strukturze .net nie ma sposobu sterowania .ToString() dla wyliczeń. Aby obejść, można utworzyć metodę rozszerzenia, a także atrybut do dekorowania różnych wartości wyliczenia. Następnie możemy napisać coś takiego:

public enum TestEnum 
{ 
    [EnumString("Value One")] 
    Value1, 

    [EnumString("Value Two")] 
    Value2, 

    [EnumString("Value Three")] 
    Value3 
} 

EnumTest test = EnumTest.Value1; 
Console.Write(test.ToStringEx()); 
The code to accomplish this is pretty simple: 

[AttributeUsage(AttributeTargets.Field)] 
public class EnumStringAttribute : Attribute 
{ 
    private string enumString; 

    public EnumStringAttribute(string EnumString) 
    { 
     enumString = EnumString; 
    } 

    public override string ToString() 
    { 
     return enumString; 
    } 
} 

public static class ExtensionMethods 
{ 
    public static string ToStringEx(this Enum enumeration) 
    { 
     Type type = enumeration.GetType(); 
     FieldInfo field = type.GetField(enumeration.ToString()); 
     var enumString = 
      (from attribute in field.GetCustomAttributes(true) 
      where attribute is EnumStringAttribute 
      select attribute).FirstOrDefault(); 

     if (enumString != null) 
      return enumString.ToString(); 

     // otherwise... 
     return enumeration.ToString(); 
    } 
} 

[TestMethod()] 
public void ToStringTest() 
{ 
    Assert.AreEqual("Value One", TestEnum.Value1.ToStringEx()); 
    Assert.AreEqual("Value Two", TestEnum.Value2.ToStringEx()); 
    Assert.AreEqual("Value Three", TestEnum.Value3.ToStringEx()); 
} 

Kredyt trafia do tego posta.

0

Poniższy kod konwertuje AbcDefGhi na Abc Def Ghi.

public static string ConvertEnum(this string value) 
{ 
    string result = string.Empty; 
    char[] letters = value.ToCharArray(); 
    foreach (char c in letters) 
     if (c.ToString() != c.ToString().ToLower()) 
      result += " " + c; 
     else 
      result += c.ToString(); 
    return result; 
} 
Powiązane problemy