2009-10-29 19 views
18

(OK、私はここに私の無知の深さを公開します、優しくしてください)は、私はメソッドを持っている

背景

をintに型「System.Enum」に変換できません。これは、このように(ビット)になります。EnumInterpreterは、親クラスが作成されたときに渡されるのFunc <列挙型、文字列>は

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

私はEnumを使用しています。これは、このレベルでは「自分のビジネスではありません」というものです。具体的なenumが何であれ気にしません。呼び出しコードは(生成された)enumを使って魔法の文字列を避けるだけです。

質問

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

+1

[System.Enumから基本整数に変換するにはどうすればよいですか?](http://stackoverflow.com/questions/908543/how-to-convert-from-system-enum-to-base-integer) – nawfal

答えて

5

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

EDIT:

次のようにあなたが値を得ることができますが、それは醜いです:

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

うん、それは醜いです。 – Benjol

+1

'int'がenumの基になる型ではない場合、これは失敗することに注意してください。 –

+0

まあ、私はそれがuintではないことを告白する必要がありますが、私は私のために働く何かを見つけたと思う... – Benjol

33

System.Enumは直接整数にキャストすることはできませんが、それは明示的にあなたができることを意味し、IConvertibleを実装しません次のコマンドを使用します。

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

あなたの列挙型は、実際に(floatのような)整数以外のものを使用している場合、あなたはCONVの非整数データを失うことに注意してくださいersion。ライアンの答えはOKに見えますが、...私はむしろに列挙型を下に通過する

1):または明らかに(それが知られていた場合)あなたから変換しているものは何でもして変換コールここ

+7

C#enumsは浮動小数点数にすることはできません:http://msdn.microsoft.com/en- us/library/sbbt4032%28VS.71%29.aspx - **すべての列挙型には基本的な型があり、整数型** –

1

様々なものを置き換えます列挙型インタプリタのように、変換全体を行うことができます。そこに...。あなたが整数ベースの列挙型のみを使用していることがわかっている場合、Convert.ToInt32()は問題ありません。それ以外の場合は、リフレクションを使用して追加したり、他のコンバージョンを試したり試したりすることができます。

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

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

4)変数の命名から判断してC++/MFCの背景があるようです。あなたはC#スタイルの命名規則に入ることを望むかもしれませんが、他の人々のコードとライブラリを使用/読んでいるときに人生を楽にします。 MSのStyleCopをチェックして、名前付けに役立つアドインを探しましょう。

+0

にすることができます。1)実際にはuintですが、何もそれを指示しません。 2)EnumInterpreterの現在の(唯一の)実装は実際にEnum.GetName()を使用し、GetValue()は存在しません。 3)EnumInterpreterが外部から渡される/オーバーライドされることを考えると、私はあまり信頼したくありませんでした。 4)私はその背景にいる人々と一緒に働いています。彼らは私の前で命名規則を決めましたが、私はあなたの提案をチェックします。 – Benjol

+0

ええ、申し訳ありませんが、実際には.GetValues() –

1

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

たまたま私が発見し、何かをしようとしているときに、私は、文字列の最後にそれをwodgeた場合、私は私が望む結果を得ることです:

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

私は実際に私の質問にintに簡素化実際のデータ型はuint(この特定のインスタンスでは)です。幸いにも、私は実際に文字列がほしいと思ったので、私はそれについて心配する必要はありません。

私は「右」であるので、離れて投票...

-3

なぜ文字列に列挙型を解析し、実際の列挙型の値を返しませ?3件の他の回答のかわからないんだけど

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 }; 

string name = MyEnum.Flower.ToString(); // returns "Flower" 

私は.ToString()が廃止されてだと思うし、私はそれを行うための新しい方法についてはよく分かりません。私は実際の列挙表現がintよりも有用であると思っていたでしょうか?

+1

問題のコードのコンテキストでは、私は列挙型にアクセスできません。 – Benjol

+2

'.ToString()'の1つのオーバーロードしか実際には推奨されていません。インテリセンスは実際にはかなり誤解を招きます。 – tomfanning

+0

"列挙型を解析して実際の列挙型の値を返してみませんか?" - 基礎となるInt32は実際の列挙値です。 – bubbleking

4

はこれを試してください。..

m_EnumInterpreter((int型)(オブジェクト)enumVal)。

0

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

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

うまくいけば、それは誰かに助けになると思います。ダブルキャストFTW。

関連する問題