web-dev-qa-db-ja.com

ランタイムに列挙型に追加できますか

列挙型がある場合:

public enum Sport
{
    Tennis = 0;
    Football = 1;
    Squash = 2;
    Volleyball = 3;
}

実行時に何らかの方法で追加できますか?

PingPong = 4
34
CJ7

Enumにはバッキングストアがあり、指定しない場合のデフォルトはintです。定義された値以外の値を直接割り当てることができます。

_Sport pingPong = (Sport)4;
_

次に、それを確認できます。

_if (value == (Sport)4) {}
_

そのため、実際の値が期待値の範囲内にあるかどうかを確認するための静的関数 Enum.IsDefined() があります。この関数は複合フラグ値に対しては機能しないことに注意してください。

_bool isValueDefined = Enum.IsDefined(typeof(Sport), value);
_

編集:Hans Passantのコメントの後:リテラル値4を使用する必要はありません。intを返すものなら何でも使用できます。例えば:

_Dictionary<int, string> AdditionalSports = new Dictionary<int, string>();
AdditionalSports.Add(4, "PingPong");

// Usages: if
if (AdditionalSports.ContainsKey(value))
{
    // Maybe do something with AdditionalSports[value], i.e. "PingPong"
}

// In a switch:
switch (value)
{
case default:
    // Since it won't be found in the enum-defined values
    if (AdditionalSports.ContainsKey(value))
    {
        // Maybe do something with AdditionalSports[value], i.e. "PingPong"
    }
}
_
32
Daniel Rose

いいえ、実行時にタイプを変更することはできません。新しいタイプを発行することはできますが、既存のタイプを変更することはできません。

5
Darin Dimitrov

ええ、はい、実行時に EnumBuilder クラスを使用してEnumを作成または変更できます。MSDNのサンプルを参照してください

ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int));
eb.DefineLiteral("Low", 0);
eb.DefineLiteral("High", 1);
Type finished = eb.CreateType();

私の意見では、列挙型の値を持つことは、辞書やリストベースのソリューションよりもメモリの使用量が少なく、スレッドの副作用がないため好ましいです。

ここにいくつかのサンプルがあります アプリケーションを再起動したときに生成された列挙型をロードする方法について。私はあなたのために機能するものを選ぶことをお勧めします System.AddIn によって提供されるメソッドを使用することができます。

機械学習用のデータを生成する必要がある場合、これを使用します。IOがこれらの大データセット。

2
PPann

プログラムの起動時に列挙型を定義できる場合は、別のアセンブリに列挙型を配置し、列挙型を再コンパイルして古いバージョンを上書きするブートストラップを使用して、実際のアプリケーションを起動します。これは最もクリーンな方法ではありませんが、機能します。

0
Stephan

このように必要になるすべての値を使用して、完全なEnumを作成します

Public enum Sport
{
    Tennis = 0;
    Football = 1;
    Squash = 2;
    Volleyball = 3;
    PingPong = 4;
    Rugby = 5;  // for example
}

そして、無効なスポーツエントリのリストを保持するため、リストには最初にPingPongRugbyが含まれます。 Enumにアクセスするたびに、Invalid Sportsリストも確認してください。

次に、無効なスポーツリストを調整して、どの段階でも合わせることができます

0
Grantly