3

重複の可能性:
Enum 値の TryParse の方法は?

Enum.TryParse を持たない .net 3.5 を使用しています。

では、文字列を列挙型に安全に解析するにはどうすればよいですか?

私は.net 4.0でこれを行っていました:

SomeEnum someEnum;
if (Enum.TryParse(someString, true, out someEnum))
{
  //
}
4

2 に答える 2

7

Enum.GetNames(...).Contains を使用してから Enum.Parse を使用できます。

于 2012-10-10T21:19:02.877 に答える
3

欠落しているメソッドの別のバージョン: 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;
于 2012-10-10T21:23:17.673 に答える