どのように変換すから。Enumベースの整数?
-
05-09-2019 - |
質問
きたらと思い汎用的な方法で変換する他のシステム。Enum派生型のそれに対応する整数値でなく、鋳造、好ましくない構文解析、文字列になります。
例えば、だいたいというようにす:
// Trivial example, not actually what I'm doing.
class Converter
{
int ToInteger(System.Enum anEnum)
{
(int)anEnum;
}
}
これが表示されていない。簡単に、ios、androidとmac用にc#の報告できませんのでキャストの表現型システムEnum'タイプ'int'.
さんってこのソリューションがもう少しています。
class Converter
{
int ToInteger(System.Enum anEnum)
{
return int.Parse(anEnum.ToString("d"));
}
}
ご意見募集
解決
あなたはキャストしたくない場合は、
Convert.ToInt32()
トリックを行うことができます。
((int)enumValue
を経由して)直接キャストすることはできません。列挙型は、(... int
、long
、byte
)異なる基礎となる型を持つことができるので、これはまた、「危険」になることに注意してください。
より正式:System.Enum
は(両方ともInt32
sあるが)ValueType
と直接継承関係を有していないので、明示的なキャストは、タイプシステム内で正しいことができない
他のヒント
私はそれがオブジェクトにキャストして、int型にすることによって動作するようになった。
public static class EnumExtensions
{
public static int ToInt(this Enum enumValue)
{
return (int)((object)enumValue);
}
}
これはおそらく最良の方法ではない醜いです。私は
....私はより良い何かを考え出すことができるかどうかを確認するために、それをいじりしておこうEDIT:。Convert.ToInt32(enumValue)は、同様に動作することを投稿してちょうど約ました、そしてMartinStettnerはそれに私を打つことに気づいた。
public static class EnumExtensions
{
public static int ToInt(this Enum enumValue)
{
return Convert.ToInt32(enumValue);
}
}
テスト
int x = DayOfWeek.Friday.ToInt();
Console.WriteLine(x); // results in 5 which is int value of Friday
EDIT 2:コメントの中で、誰かがこれが唯一のC#3.0で動作することを述べました。私はちょうどこのようにVS2005でこれをテストし、それが働いた:
public static class Helpers
{
public static int ToInt(Enum enumValue)
{
return Convert.ToInt32(enumValue);
}
}
static void Main(string[] args)
{
Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday));
}
あなたが変換する必要がある場合は、のいずれかのの(すべての列挙型はint
が付いていない)その基になる型に列挙型、あなたが使用することができます:
return System.Convert.ChangeType(
enumValue,
Enum.GetUnderlyingType(enumValue.GetType()));
なぜあなたはヘルパーメソッドで車輪の再発明する必要がありますか?それは、その基になる型にenum
値をキャストするために完全に合法です。
これは、より少ないタイピングがだ、と私の意見では、より読みやすい、使用する...
int x = (int)DayOfWeek.Tuesday;
...のような...というより何か
int y = Converter.ToInteger(DayOfWeek.Tuesday);
// or
int z = DayOfWeek.Tuesday.ToInteger();
ここの私の答えはから:
にようe
を考える:
Enum e = Question.Role;
そして、これらの作業ます:
int i = Convert.ToInt32(e);
int i = (int)(object)e;
int i = (int)Enum.Parse(e.GetType(), e.ToString());
int i = (int)Enum.ToObject(e.GetType(), e);
最後の二つは平野醜いです。二つ目は、はるかに高速ですが、最初のものは、読みやすくする必要があります。または延長方法であってもよいことは、両方の世界の最高の、最高です。
public static int GetIntValue(this Enum e)
{
return e.GetValue<int>();
}
public static T GetValue<T>(this Enum e) where T : struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T>
{
return (T)(object)e;
}
今、あなたは呼び出すことができます:
e.GetValue<int>(); //or
e.GetIntValue();
System.Enum
からint
に鋳造は私のために正常に動作します(それは<のhref =「http://msdn.microsoft.com/en-us/library/sbbt4032.aspx」のrel =「nofollowをnoreferrer」にもあります> MSDN を)。おそらくそれはReSharperのバグです。
以来、Enumsが制限されるバイトsbyte、short、ushort,int,uint、ulongきましたが一部の前提になっていました。
を回避し中に例外が発生すると、変換用の可能。残念ながら、コンテナの使用が明確でないulong爆発のための負の数と長爆発のための数と長さです。MaxValueとulong.MaxValue.またスイッチ間の選択に基づく基になるタイプです。
もちろん、まだ必要とする場合の結果なのでサイズ調整する場合もある.と思い鋳造では大丈夫だが、一部のgotchas:
- のためのenumsに基づくタイプとともに、パネルディススペース以上のint(長ulong可能であenumsを評価すると、同じ値を表示します。
- 鋳造の多数によint.MaxValue例外をスローした場合はチェック。
ここでの私の提案までのリーダーを決める場所には置かないでください機能としてのヘルパーやしてください。
public int ToInt(Enum e)
{
unchecked
{
if (e.GetTypeCode() == TypeCode.UInt64)
return (int)Convert.ToUInt64(e);
else
return (int)Convert.ToInt64(e);
}
}
列挙型自体はそれに静的なヘルパー関数の束を持っていることを忘れないでください。あなたがしたいすべてがそれに対応する整数型に列挙型のインスタンスを変換の場合、キャストは、おそらく最も効率的な方法です。
私は、列挙型は、特定のタイプの列挙ではなく、列挙型自体はスカラー値型、列挙型ではないから派生するので、ReSharperのが不平を言っていると思います。あなたは一般的な方法で適応キャストが必要な場合は、私はこれがあなたによく、スイートでしたと言うでしょう(列挙型自体もジェネリックに含まれていることに注意します:
public static EnumHelpers
{
public static T Convert<T, E>(E enumValue)
{
return (T)enumValue;
}
}
これはそのようにのように使用することができます:
public enum StopLight: int
{
Red = 1,
Yellow = 2,
Green = 3
}
// ...
int myStoplightColor = EnumHelpers.Convert<int, StopLight>(StopLight.Red);
私は私の頭の上から確かに言うことはできませんが、上記のコードは、さらに次のことをできるように、C#の型推論によってサポートされる可能性があります:
int myStoplightColor = EnumHelpers.Convert<int>(StopLight.Red);