2013-03-05 14 views
11

属性にスペースが含まれているが非常に難しい列挙型を設定しようとしましたが、これは文字列形式などで簡単にハッキングできます。それにはスペースがあり、私はそれが何であるかを正確に知っています。この文字列この文字列に単語の間に空白を追加する

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** 
     } 

答えて

5

にスペースを追加し、任意の助けwihtあなたが拡張メソッドを使用して列挙に独自のToStringメソッドを作成することができます。

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

      return addressType.ToString(); 
    } 
} 
12

あなたの列挙型のエントリはキャメルケースである場合は、上部の手紙

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

"UnitedArabEmirates"で動作しますか? :) –

+0

@ダンジャー確かに試してください – VladL

+1

ああ、そうです。それは各トークンの前にスペースを置くので、トリムです。 –

1

前に空白を挿入することができ、私は、まさにこの

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); 
    } 

} 

例のための便利な拡張メソッドを持っています。

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私はそのメソッドを 'ToPascalString'の正反対の*と見なします。 :) – Brandon

+0

LOL、良い点私は実際にそれについて考えなかった、私は今年私の図書館でそれを変更する必要がありますLOL –

+0

メソッドの追加方法 –

2

これは私が昨日見つけた素敵なトリックです(2009年)。なぜ私はそれを自分で考えなかったのだろう? .netフレームワークでは、列挙のために.ToString()を制御する方法がありません。これを回避するために、列挙の異なる値を修飾する属性と同様に、拡張メソッドを作成することができます。次に、次のように書くことができます。

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()); 
} 

この投稿にはクレジットがあります。

0

次のコードは、AbcDefGhiAbc 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; 
} 
関連する問題