NDW

アプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング 実装技術

.NET Core(C#): enumの使い方サンプル

投稿日:2021年7月16日 更新日:

はじめに

  • サンプルは.NET Core 3.1 + C# 8.0で動作確認しています。
  • 完全なソースコードはこちらで公開しています。
  • enumは基本的には数値型を保持しますが、文字列を保持したい場合はこちらでサンプルを公開しています。
  • 以降のサンプルでは次の列挙体を使用します。
    public enum EnumTest1
    {
        Val1,       // 0
        Val2 = 100, // 100
        Val3        // 101
    }
    public enum EnumTest2
    {
        ValA = 100,
        ValB = 200,
        ValC = 300
    }
    public enum EnumTest3
    {
        No, Yes
    }
    

列挙体の基本操作

// 列挙体の基底クラスはEnum、基になる値型はint
var e = EnumTest1.Val1;
var et = e.GetType();
Console.WriteLine(et.FullName);
// -> "BasicExample.EnumExamples.EnumTest1"
Console.WriteLine(et.BaseType.FullName);
// -> "System.Enum"
Console.WriteLine(et.UnderlyingSystemType.FullName);
// ->"BasicExample.EnumExamples.EnumTest1"
Console.WriteLine(et.GetEnumUnderlyingType().FullName);
// -> "System.Int32"

// 列挙体の名称と整数値を取得
var val1str = EnumTest1.Val1.ToString();
var val1int = (int)EnumTest1.Val1;
Console.WriteLine("{0}: {1}", val1str, val1int); // "Val1: 0"

// 列挙体の各値名の取得
var names = Enum.GetNames(typeof(EnumTest1));
Console.WriteLine(string.Join(',', names)); // "Val1,Val2,Val3"

// 列挙体の各値の一覧の取得
var array = Enum.GetValues(typeof(EnumTest2)); // System.Array型
foreach(var v in array)
    Console.WriteLine(v); // "ValA", "ValB", "ValC"

// 列挙体の各値の一覧の取得(Arrayから配列変換)
var values = array.OfType<EnumTest2>().ToArray();
Console.WriteLine(values[0]); // "ValA"
  • 列挙体と列挙体で定義される各値の基底クラスはSystem.Enumになっています。
  • 列挙体値の基となる型(UnderlyingType)はintです。キャストすることにより、整数と列挙体間の変換が行えます。
  • 列挙体の値名一覧や値一覧の取得など、列挙体に関する各種操作はEnumクラスで行えます。
  • 列挙体の値一覧を取得するEnum.GetValues()の返却値はSystem.Array型になっています。配列として扱う場合はLINQ(OfType)で変換できます。

列挙体の静的変換

// 整数から列挙体に変換
var int100 = 100;
Console.WriteLine(Enum.IsDefined(typeof(EnumTest2), int100));  // "True"
EnumTest1 val2 = (EnumTest1)int100;
Enum.IsDefined(typeof(EnumTest1), val2);
Console.WriteLine("{0}({1})", val2, val2.GetType().FullName);
// -> "Val2(BasicExample.EnumExamples.EnumTest1)"

// 整数から列挙体に変換(該当する列挙体値なし)
var int999 = 999;
Console.WriteLine(Enum.IsDefined(typeof(EnumTest1), int999)); // "False"
EnumTest1 valx = (EnumTest1)int999;
Console.WriteLine("{0}({1})", valx, valx.GetType().FullName);
// -> "999(BasicExample.EnumExamples.EnumTest1)"

// Enum型から特定の列挙体に変換
Enum e = EnumTest1.Val2; // Val2は100
EnumTest1 e1 = (EnumTest1)e;
Console.WriteLine(e1); // "Val2"
EnumTest2 e2 = (EnumTest2)e;
Console.WriteLine(e2); // "ValA"(EnumTest2で100はValA)

// Enum型から特定の列挙体に変換(該当する列挙体値なし)
EnumTest3 e3 = (EnumTest3)e;
Console.WriteLine(e3); // "100"
  • 列挙体に実在しない値を指定しても例外は発生せず、列挙体の値として保持されます。変換時に列挙体値にない値を許容するかどうかの注意が必要です。
  • 列挙体に存在する値かどうかはEnum.IsDefined()で判定できます。
  • 列挙体の既定値(基となる型)は0であるため、0に対応する列挙体値を用意することが推奨されています。列挙体のベストプラクティスをご覧ください。

列挙体の動的変換

// 変換先列挙体を実行時に決定する想定の例
var enumTest2 = Type.GetType("BasicExample.EnumExamples.EnumTest2");

// 列挙体に含まれる値か否かを判定
Console.WriteLine(Enum.IsDefined(enumTest2, 400)); // "False"
Console.WriteLine(Enum.IsDefined(enumTest2, 300)); // "True"

// 整数を列挙体に変換
var valc = Enum.ToObject(enumTest2, 300);
Console.WriteLine("{0}({1})", valc, valc.GetType().FullName);
// -> "ValC(BasicExample.EnumExamples.EnumTest2)"

// 整数を列挙体に変換(該当する列挙体値なし)
var val999 = Enum.ToObject(enumTest2, 999);
Console.WriteLine("{0}({1})", val999, val999.GetType().FullName);
// -> "999(BasicExample.EnumExamples.EnumTest2)"

// 文字列を列挙体に変換
var valb = Enum.Parse(enumTest2, "ValB", true);
Console.WriteLine("{0}({1})", valb, valb.GetType().FullName);
// -> "ValB(BasicExample.EnumExamples.EnumTest2)"

// 文字列を列挙体に変換(該当する列挙体値なし)
var valx = Enum.Parse(enumTest2, "ValX", true);
// -> System.ArgumentException : Requested value 'ValX' was not found.
  • 整数を任意の列挙体に変換する場合は、Enum.ToObject()を使用します。前述の通り、列挙体の値に対応する整数かどうかはEnum.IsDefined()で判定できます。
  • 列挙体の値名を列挙体値に変換する場合は、Enum.Parse()またはEnum.TryParse()を使用します。







-.NET Core, 1. システムエンジニアリング, 実装技術

関連記事

ASP.NET Core: 変更ページを実行環境に反映

ASP.Net Core(3.0)の開発で、ページ(cshtml)を編集しながらページデザインを確認したい。 既定ではページを変更しても実行環境に反映れずサーバの再起動が必要となり開発効率が悪い。 サ …

PowerPointの削除できない個人情報を消す

PowerPointで「個人情報の削除」を実行するとこで、作成者や会社名等の個人情報を削除できます。しかしながら、特定の項目に入った個人情報については、PowerPointやWindowsの標準機能で …

chromeのjavascriptを一時的に無効化

Webアプリの開発やテストで、クライアント側のバリデーションを無効にしてサーバ側バリデーションの動作確認する、等のように一時的にjavascriptを無効にしたい場合があります。これを実現するための方 …

Java正規表現によるパラメータ置換

mybatis-generatorが生成するクエリカスタマイズのために、生成されたクエリ上のパラメータを置換する方法を調べたので記載しておきます。 サンプルプログラム Java言語の場合、標準ライブラ …

VULTRでRHEL8をインストール(2/2)

VULTRのVPSにRHEL8.3をインストールする手順を説明します。 概要 ここでは、VULTRにRHEL用のVPSを構築した状態から、RHELをインストールする手順を説明します。 VULTRにRH …