2009-07-13 10 views
15

C#enum定数にスペースを入れる方法はありますか?C#Enumsのスペース

Public Enum EnumWithSpaces 
    ConstantWithoutSpaces 
    [Constant With Spaces] 
End Enum 

を...そして、このようにアクセス:私はあなたがこれを行うことによって、VBでそれを行うことができます読んだCLRは、列挙型を扱うことができるように私には意味

Public Sub UsingEnumWithSpaces() 

    Dim foo As EnumWithSpaces = EnumWithSpaces.[Constant With Spaces] 

End Sub 

スペースで。

C#でこれを行う方法はありますか?

答えて

36

このブログの記事はあなたを助けるかもしれない:

http://blog.spontaneouspublicity.com/2008/01/17/associating-strings-with-enums-in-c/

記事より:

しかし、列挙型は、C#でスペースを持つことはできません」 あなたがよく言います。 、私は System.ComponentModel.DescriptionAttribute を使用して、よりわかりやすい説明をに追加したい列挙型の値。私はその項目のToString()バージョンがうまく表示項目に説明を入れていないことを

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

は注意:例の列挙は 次のように書き換えることができます。

+0

ユダは私のためにこれをきれいにしようとしてくれてありがとう。私はそれが正しいように見せようとしている時を過ごしていた。 –

+2

ToStringが自動的に属性を使用した場合、これはうまくいくでしょう。それが立てば、それはそれほど有用ではありません。 –

+0

私は 'ToDescription'拡張メソッドと共に常に' DescriptionAttribute'を使うことができると思います。 – cdmckay

9

CLRでは、識別子の中のすべての文字を絶対に処理できます。ただし、C#では、識別子文字がCLSの正当な文字に制限されます。ちなみにVB.NETでも同じことが起こります。角括弧内のスペースはVB6で動作するのに使われましたが、VB.NETでは使用できません。

+0

反射を使用して列挙定数を変更できますか? – cdmckay

+0

コンパイルされたアセンブリを読み込んで処理して、列挙型の名前を置き換えるか、または実行時に定数を変更することを意味しますか?後者は不可能です。前者はですが、 'ildasm'を使って逆アセンブルし、必要に応じて名前を置き換え(これは正規表現で自動化することができます)、' ilasm'を使って再度アセンブリにするのがはるかに簡単になると思います。代わりに、最初にILのenumを宣言し、 'ilasm'を使って.netmoduleにコンパイルし、そのモジュールをC#/ VBアセンブリにリンクすることができます。 –

+0

私は 'DescriptionAttribute'を使い、' DescriptionAttribute'が定数であるかのようにenumにアクセスするための独自の静的クラスを作成しました。 – cdmckay

0

は、Visual C#3.0または私はちょうど列挙クラスを拡張し、neccessaryはどこにスペースをはめ込むために正規表現を使用することが便利で見つけた上で作業している場合:

public static class EnumExtension 
{ 
    public static String ToDisplayString(this Enum e) 
    { 
     Regex regex = new Regex(@"([^\^])([A-Z][a-z$])"); 

     return regex.Replace(e.ToString(), new MatchEvaluator(m => 
     { 
      return String.Format("{0} {1}", m.Groups[1].Value, m.Groups[2].Value); 
     })); 
    } 
} 

お知らせこれはあなたが動作することができますすべての値に説明を追加することなく、任意の列挙型をそのまま使用できます。

String enumWithSpaces = MessageBoxButtons.OKCancel.ToDisplayString();