C#で列挙型のchar値を取得するよりきれいな方法はありますか?.
public enum DivisionStatus
{
None = 'N',
Active = 'A',
Inactive = 'I',
Waitlist = 'W'
}
string status = Enums.DivisionStatus.Active.ToString()[0].ToString(); // "A"
値をキャストするだけです:
char status = (char)Enums.DivisionStatus.Active;
これは識別子の代わりに値を使用することに注意してください。 Enums.DivisionStatus.Active
値は、'A'
の文字コードです。これは、ユーザーが定義した値であるためです。
値を直接使用する方が、値の識別子を検索するよりも高速です。
私は問題を解決する「疑似列挙型」を構築します。あなたの場合、それは次のようになります:
public class DivisionStatus
{
public static readonly DivisionStatus None = new DivisionStatus('N');
public static readonly DivisionStatus Active = new DivisionStatus('A');
public static readonly DivisionStatus Inactive = new DivisionStatus('I');
public static readonly DivisionStatus Waitlist = new DivisionStatus('W');
internal char Value { get; private set; }
public override string ToString()
{
return Value.ToString();
}
protected DivisionStatus(char value)
{
this.Value = value;
}
}
キャストせずにToString()のchar enum値を返すenumのように使用できます。
Console.WriteLine(DivisionStatus.None); // returns 'N'
静的クラスを使用することもできます。ただし、常に値を文字列として使用する場合は、各プロパティを文字列にするのと同じくらい簡単にできます。この方法の1つの利点は、InteliSenseに表示される各アイテムの説明を追加できることです。
public static class DivisionStatus
{
/// <summary>
/// Some information about None
/// </summary>
public const char None = 'N';
/// <summary>
/// Some information about Active, blah blah
/// </summary>
public const char Active = 'A';
/// <summary>
/// Some information about Inactive, blah blah
/// </summary>
public const char Inactive = 'I';
/// <summary>
/// Some information about Waitlist, blah blah
/// </summary>
public const char Waitlist = 'W';
}
シンプルなキャスティングが機能し、私はそれを試しました:
using System;
public enum DivisionStatus
{
None = 'N',
Active = 'X',
Inactive = 'I',
Waitlist = 'W'
}
class Program
{
public static void Main()
{
var ds = DivisionStatus.Active;
Console.WriteLine((char)ds);
}
}
var status = (char)Enums.DivisionStatus.Active;
は、望みどおりの動作をします。 enumテキストの最初の文字が基になるchar値と一致しない場合、以前の方法ではうまくいかなかったでしょう。
これは、バッキングタイプとしてintを持つ列挙型でも機能します。
ToStringを呼び出さずにenum値をキャストするだけです。
var status = (char)DivisionStatus.Active;
または多分あなたはする必要があるでしょう
var status = (char)(int)DivisionStatus.Active;