11

属性にスペースを含む列挙型を設定しようとしましたが、非常に困難だったので、文字列形式などでこれをハックする簡単な方法である可能性があると考えました。スペースが必要な列挙型は 1 つだけであり、それが何であるかを正確に知っているからです。 . この文字列にスペースを追加するのに役立つもの

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

5 に答える 5

14

列挙型エントリがキャメルケースの場合、大文字の前に空白を挿入できます

string res = Regex.Replace("UnitedStates", "[A-Z]", " $0").Trim();
于 2013-03-05T21:15:47.977 に答える
5

ToString拡張メソッドを使用して、列挙に独自のメソッドを作成できます。

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

          return addressType.ToString();
     }
}
于 2013-03-05T21:11:11.640 に答える
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());
}

クレジットはこの投稿に送られます。

于 2013-03-05T21:24:44.510 に答える
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
于 2013-03-05T21:19:23.397 に答える
0

次のコードはに変換AbcDefGhiされ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;
}
于 2013-03-05T21:34:59.587 に答える