2017-03-02 4 views
0

Enum vizが1つあります。 CarEnumた値 すべて - 1 BMW - 2 アウディ - 3列Cとして列挙型のDataTableを辞書に変換します。

私は、データベースからこのデータテーブルを取得しています

DataTable dt = new DataTable(); 
dt.Columns.Add("ID", long); 
dt.Columns.Add("EnumID", Int16); 

私はEnumID

Enumとして辞書にDictionaryにこのテーブルを変換したいですフォーマット

Dictionary<long, CarEnum> _Record = new Dictionary<long, CarEnum>(); 

私はコード以下の試行を持っていますが、それらは

_Record = dt.AsEnumerable().ToDictionary<DataRow, long, CarEnum>(row => row.Field<long>("ID"), row => (CarEnum)Enum.ToObject(typeof(CarEnum), row.Field<Int16>("EnumID"))); 
_Record = dt.AsEnumerable().ToDictionary<DataRow, long, CarEnum>(row => row.Field<long>("ID"), row => (CarEnum)(int)row.Field<Int16>("EnumID")); 

ではありません両方のコードが動作していないと有効でないに例外特定のキャストを得ました。

助けてください。

+0

なぜ列挙型を使用しますか?代わりに特定のenumを持っていないのですか? – dbraillon

+0

'Enum'は抽象クラスであり、インスタンス化できません。 – Oliver

+0

私は具体的なEnumを持っています。私は、DataTableからのEnumIDに基づいて、列としてDictionary型の列挙型を追加したい。 –

答えて

0

私の理解から、特定のプリミティブのみを列挙してキャストできます。

this link to MSDNを参照してください。

en16の代わりにshortを使用するか、Int16にキャストする前に短くするためにInt16をキャストします。

編集: ゼロ値をキャストしようとしていて、列挙型に定義されていない可能性がありますか?

+0

キャストはInt16からInt32まで有効ですが、有効なキャストになりますが、その逆はしません –

+1

任意の値は、Enumの基になる型の範囲内にある限り、それと同等の整数にキャストされます。したがって、ゼロが定義されていなくても、範囲内にあるので有効になります。私の答えの中のイメージをチェックしてください。 –

+0

なぜ私に言っているのか分かりません – dbraillon

0

私はあなたの2番目のアプローチを試して、それは私のために正常に動作します。

enter image description here

+0

@DownVoters回答を改善する理由を追加する方が良いでしょう。 –

関連する問題