web-dev-qa-db-ja.com

列挙で数値を使用するC#

うまくいけば、クイック。

これは有効な列挙型です

public enum myEnum
{
  a= 1,
  b= 2,
  c= 3,
  d= 4,
  e= 5,
  f= 6,
  g= 7,
  h= 0xff
};

しかし、これはそうではありません

public enum myEnum
{
  1a = 1,
  2a = 2,
  3a = 3,
};

列挙型で数値を使用する方法はありますか。私はすでに列挙型からドロップダウンを作成するコードを持っているので非常に便利です

35
DrLazer

C#の識別子は、数字で始まることはできません(字句/構文解析上の理由から)。 [説明]属性を列挙値に追加することを検討してください。

public enum myEnum
{
    [Description("1A")]
    OneA = 1,
    [Description("2A")]
    TwoA = 2,
    [Description("3A")]
    ThreeA = 3,
};

次に、次のような列挙値から説明を取得できます。

((DescriptionAttribute)Attribute.GetCustomAttribute(
    typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
        .Single(x => (myEnum)x.GetValue(null) == enumValue),    
    typeof(DescriptionAttribute))).Description

以下のXSAのコメントに基づいて、これをより読みやすくする方法を拡張したいと考えました。最も簡単には、静的(拡張)メソッドを作成するだけです。

public static string GetDescription(this Enum value)
{
    return ((DescriptionAttribute)Attribute.GetCustomAttribute(
        value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)
            .Single(x => x.GetValue(null).Equals(value)),
        typeof(DescriptionAttribute)))?.Description ?? value.ToString();
}

拡張メソッドにするかどうかはあなた次第であり、上記の実装では、[DescriptionAttribute]が提供されていない場合は列挙型の通常名にフォールバックしました。

これで、enum値の説明を取得できます:

myEnum.OneA.GetDescription()
73
Kirk Woll

いいえ、ありません。 C#では、識別子を数字で始めることはできません。

アプリケーションの使用上の注意:アプリケーションでは、コード識別子をエンドユーザーに表示しないでください。個々の列挙項目をユーザーフレンドリーな表示可能なテキストに変換することを考えてください。遅かれ早かれ、識別子がユーザーに表示可能な形式にならないアイテムで列挙型を拡張する必要があります。

UPDATE:表示可能なテキストを列挙項目に添付する方法は、たとえば here のように議論されていることに注意してください。

11
Ondrej Tucny

C#(およびほとんどの言語)の識別子は数字で始めることはできません。

ドロップダウンに列挙名を入力するコードを変更できる場合、ドロップダウンに入力するときに先頭のアンダースコアを削除するハックがあり、次のように列挙を定義できます。

public enum myEnum
{
  _1a = 1,
  _2a = 2,
  _3a = 3
};

または、アンダースコアが気に入らない場合は、独自の 'prefix-to-be-stripped'スキームを考え出すことができます(enumからドロップダウンを生成するコンストラクタまたはメソッドにプレフィックスを渡すことができます)。

9
Michael Burr

ありえない。有効な識別子(つまり、有効な列挙メンバー)は数字で始めることはできません。

4
Noe

列挙は、命名規則の点で変数と変わりません。したがって、名前を数字で始めることはできません。 this post から、変数命名の主なルールを以下に示します。

  • 名前には、文字、数字、および下線文字(_)を含めることができます。

    • 名前の最初の文字は英字でなければなりません。下線も有効な最初の文字ですが、名前の最初に使用することはお勧めしません。アンダースコアは多くの場合、特別なコマンドで使用され、読みにくい場合があります。

    • 大文字と小文字が区別されます(つまり、大文字と小文字)。 C#では大文字と小文字が区別されます。したがって、名前countとCountは2つの異なる変数を参照します。

    • C#キーワードは変数名として使用できません。キーワードはC#言語の一部であるWordであることを思い出してください。 (C#キーワードの完全なリストは、付録B「C#キーワード」にあります。)

4
keyboardP

識別子は数字で始めることはできません。ただし、数字を含めることはできます。

4
Rohan Singh