1

コンボボックスの現在選択されている値を保持し、後で復元したい。コンボボックスの値を管理するために、description属性を持つ列挙型があります。description属性は、実行時にコンボボックスの文字列値(の1つ)になり、それに関連付けられた列挙定数は、プログラミングの目的で内部的に使用されます。私は次のStackOverflowの投稿からこのテクニックを入手しました:

c#:文字列定数を格納するために列挙型を使用するにはどうすればよいですか?

その投稿には、このブログ投稿へのコメントの1つにリンクが含まれていました。

http://weblogs.asp.net/grantbarrington/archive/2009/01/19/enumhelper-getting-a-friendly-description-from-an-enum.aspx

列挙型から文字列への変換マジックを実行するGetDescription()メソッドは、その投稿からここに複製され、パラメーターリストに「this」キーワードが追加されているため、列挙型の拡張メソッドとして使用できます。

    public static string GetDescription(this Enum en)
    {
        Type type = en.GetType();

        MemberInfo[] memInfo = type.GetMember(en.ToString());

        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attrs != null && attrs.Length > 0)
            {
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }

        // Unable to find a description attribute for the enum.  Just return the
        //  value of the ToString() method.
        return en.ToString();
    }

だから私は方程式の片側を完全に具体化していて、それは非常にうまく機能します。今、私は逆に行きたいです。特定の列挙型のdescription属性をウォークし、文字列に一致するdescription属性に関連付けられた列挙値を返すことにより、文字列を受け取り、正しい列挙値を返すメソッドを作成したいと思います。仮想的なメソッド宣言は次のようになります。

public static Enum GetEnumValue(string str){}

ただし、その宣言の当面の問題は、特定の列挙型を返さないことです。正しい列挙型が返されるように、物事を適切に宣言してキャストする方法がわかりません。GetDescription()メソッドを補完するこのメソッドを作成することは可能ですか?作成する場合、特定の列挙型で便利に機能するように作成するにはどうすればよいですか?これができれば、制御設定を永続化するために使用される文字列間で変換し、後でそれらを復元するという一般的な問題の便利な解決策が得られます。これらはすべて列挙型でサポートされています。

4

1 に答える 1

3

Enum を確認するための情報が欠落しています。

現在、文字列のみを渡していますが、Enum の型は渡していません。

最も簡単な方法は、ジェネリック関数を使用することです

これの内容はカフから外れており、おそらくコンパイルさえしないことに注意してください。

public static TEnum GetEnumValue<TEnum>(string str)
    where TEnum : struct //enum is not valid here, unfortunately
{
    foreach (MemberInfo memInfo in typeof(TEnum).GetMembers())
    {
        object[] attrs = memInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

        if (attrs != null && attrs.Length > 0)
        {
            if (((DescriptionAttribute)attrs[0]).Description == str)
            {
                return (TEnum)(object)Enum.Parse(typeof(TEnum),memInfo.Name);
            }
        }
    }

    // Unable to find a description attribute for the enum.
    return (TEnum)(object)Enum.Parse(typeof(TEnum),str);
}

次にtypeof(TEnum)、要求された列挙の型オブジェクトを取得し、ロジックを実行するために使用できます。

最後にTEnum、返す前にキャストバックして、呼び出し側の作業を節約できます。

編集:

テストされていない大まかな例を追加しました。

于 2013-02-07T18:21:28.063 に答える