web-dev-qa-db-ja.com

タイプ 'System.Enum'をintに変換できません

(OK、ここで私の無知の深さを明らかにします、穏やかにしてください)

背景

私は(少し)次のように見えるメソッドを持っています:

public void AddLink(Enum enumVal)
{
     string identifier = m_EnumInterpreter(enumVal);
     AddLink(identifier);
}

EnumInterpreterは、親クラスの作成時に渡されるFunc <Enum、string>です。

このレベルでは「私のビジネスではない」ため、列挙型を使用しています。特定の列挙型がどれであるかは関係ありません。呼び出し元のコードは、(生成された)列挙型を使用してマジックストリングを回避します。

質問

EnumInterpreterが空の文字列を送り返す場合、enumValの実際の値で例外をスローしたいと思います。 intにキャストできると思っていたのですが、コンパイラーにはありません。私は何が間違っているのですか? (「すべて」とは言わないでください)。

25
Benjol

System.Enumを直接Integerにキャストすることはできませんが、IConvertibleを明示的に実装しているため、次を使用できます。

public void AddLink(Enum enumVal)
{
    string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal));
    AddLink(identifier);
}

列挙型が実際に整数以外のもの(floatなど)を使用している場合、変換時に非整数データが​​失われることに注意してください。または、明らかに、Convert呼び出しを変換元のものに置き換えます(わかっている場合)

41
Ryan Brunner

いいえ、System.Enumは列挙型ではなく、列挙型の基本クラスであるため、intにキャストすることはできません。

編集:

次のように値を取得できますが、見苦しいです。

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);
6

これを試して..

m_EnumInterpreter((int)(object)enumVal);

4
Joo Park

ここでさまざまなこと:

1)Ryanの答えは問題ないように見えますが、Convert.To ...全体を実行できるように、列挙型を列挙型インタープリターに渡したいと思います。整数ベースの列挙型のみを使用していることがわかっている場合は、Convert.ToInt32()で問題ありません。それ以外の場合は、リフレクションを使用するか、他の変換を試行/キャッチして追加することをお勧めします。

2).GetName()、. GetValue()などのEnumクラスのメンバーは、列挙型に関係なく定義された名前と値を直接処理するため、それらの使用を検討することもできます。

3)技術的には、列挙型インタープリターの外部に例外をスローしません。その条件が一般的に真である場合は、列挙型インタープリター内から例外をスローして、クラスのすべての使用が検証の恩恵を受けるようにします。または、コードが重複してしまう可能性があります。

4)変数の名前から判断すると、C++/MFCのバックグラウンドを持っているようです。 C#スタイルの命名規則を取り入れることをお勧めします。これにより、他の人のコードやライブラリを使用/読み取るときに、作業が楽になります。ネーミングに役立つ優れたアドインについては、MSのStyleCopを確認してください。

1
Hefaistos68

これを質問に含めるのか、それとも回答として含めるのかわかりません。問題はそれが答えではないということです、しかしそれは私のために働く答えです。

私が偶然に何か他のことを試みているときに発見したのは、それを文字列の最後に押し込むだけで、欲しいものが得られるということです。

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal);
//EnumInterpreter returns empty string for enumVal=3720116125

私の質問では、実際にはintに簡略化していますが、実際のデータ型はuintです(この特定のインスタンスでは)。幸い、実際に弦が欲しかっただけなので、心配する必要はありません。

他の3つの答えのどれが「正しい」かわからないので、投票してください...

1
Benjol

これはおそらくあなたの正確な問題の解決策ではないことを理解していますが、私が使用していた特定のAPIについてこれをどのように解決したかを投稿したいと思います。

int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType( arg1, arg2 );

うまくいけば、それは誰かの助けになるでしょう。ダブルキャストFTW。