重複の可能性:
Enum 値の TryParse の方法は?
Enum.TryParse を持たない .net 3.5 を使用しています。
では、文字列を列挙型に安全に解析するにはどうすればよいですか?
私は.net 4.0でこれを行っていました:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
重複の可能性:
Enum 値の TryParse の方法は?
Enum.TryParse を持たない .net 3.5 を使用しています。
では、文字列を列挙型に安全に解析するにはどうすればよいですか?
私は.net 4.0でこれを行っていました:
SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
//
}
Enum.GetNames(...).Contains を使用してから Enum.Parse を使用できます。
欠落しているメソッドの別のバージョン: Enum.TryParse (in C#)
すべてのタイプの「TryParse」メソッドは非常に便利で、私は常にそれらを使用しています。Microsoft が Enum.TryParse という非常に便利なメソッドをフレームワークに含めなかったことは非常に驚くべきことです。多くのコーダーは、列挙型の「解析」メソッドを時々書いていることに気づきます。そんな感じ:
public enum ImageType
{
Jpg,
Gif,
Png
}
public static ImageType ParseImagetype(string typeName)
{
typeName = typeName.ToLower();
switch (typeName)
{
case "Gif":
return ImageType.Gif;
case "png":
return ImageType.Png;
default:
case "jpg":
return ImageType.Jpg;
}
}...
それはうまくいきますが、あなたが持っている列挙型ごとにそのような「解析」メソッドを書く必要があります。Enum クラスには独自の「解析」メソッド (幸運にも「IgnoreCase」フラグがあります) がありますが、TryParse メソッドはありません。一般的な修正方法は、Try & Catch 内に Enum.Parse メソッドを配置することです。つまり、もちろん、失敗した場合にパフォーマンスが低下します。Enum クラスには、値が列挙に存在するかどうかを示す「IsDefined」メソッドもあります。残念ながら、このメソッドには「IgnoreCase」フラグがありません。
したがって、このすべての「知識」をまとめようとして、大文字と小文字を区別せず、try & catch を使用しない「Enum.TryParse」メソッドの独自の汎用バージョンを作成しました。
public static bool EnumTryParse<T>(string strType,out T result)
{
string strTypeFixed = strType.Replace(' ', '_');
if (Enum.IsDefined(typeof(T), strTypeFixed))
{
result = (T)Enum.Parse(typeof(T), strTypeFixed, true);
return true;
}
else
{
foreach (string value in Enum.GetNames(typeof(T)))
{
if (value.Equals(strTypeFixed, StringComparison.OrdinalIgnoreCase))
{
result = (T)Enum.Parse(typeof(T), value);
return true;
}
}
result = default(T);
return false;
}
}
行 'string strTypeFixed = strType.Replace(' ', ' ');' これは、列挙文字列をスペースで送信するサードパーティの WebService からデータを取得していたためです。これは列挙では許可されていないため、列挙にはスペースではなく ' ' が含まれていました。
(上記の例から) ImageType を解析するには、次のように使用します。
ImageType type;
if (Utils.EnumTryParse<ImageType>(typeName, out type))
{
return type;
}
return ImageType.Jpg;