82

次のような小さなメソッドがあります。

public void SetOptions<T>() where T : Enum
{
    int i = 0;
    foreach (T obj in Enum.GetValues(typeof(T)))
    {
        if (i == 0)
            DefaultOption = new ListItem(obj.Description(), obj.ToString());
        i++;
        DropDownList.Items.Add(new ListItem(obj.Description(), obj.ToString()));
    }
}

基本的に、列挙型からドロップダウン リストを作成します。Description()は実際には列挙型の拡張メソッドであるため、T間違いなくenum.

ただし、objenum を this(int)objのようにインデックスにキャストするのと同じようにキャストしたいのですが、T を int に変換できないというエラーが表示されます。これを行う方法はありますか?

4

13 に答える 13

57

これを試して、

public void SetOptions<T>()
{
    Type genericType = typeof(T);
    if (genericType.IsEnum)
    {
        foreach (T obj in Enum.GetValues(genericType))
        {
            Enum test = Enum.Parse(typeof(T), obj.ToString()) as Enum;
            int x = Convert.ToInt32(test); // x is the integer value of enum
                        ..........
                        ..........
        }
    }
}
于 2013-06-06T11:45:15.180 に答える
5

これは、基になるタイプで動作しています

Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()))

たとえば、SqlCommand列挙型をに変換する値を に追加したい場合、0それを一致する型に明示的にキャストする必要があります。しかし、次の拡張子を書くことができます:

public static void AddEnum(this SqlParameterCollection parameters, string parameterName, Enum value)
{
    parameters.AddWithValue(parameterName, Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType())));
}

それは私たちのためにすべてをやっています。

于 2016-12-23T13:43:16.780 に答える
3

を使用してジェネリック T を Enum に制限する場合

where T: Enum

その後、以下のワンライナーを使用できます

public static int GetIndexFromEnum<T>(T enumValue) where T : Enum {
    int index = Convert.ToInt32(enumValue);
    return index;
}

T が Enum になることを保証できる限り、これは最も簡単な解決策のように思えます。

于 2020-02-13T19:12:53.303 に答える
2

あなたのコードがまったく機能することに驚いています。Enum.GetValues整数の配列を返します。これは、探している値です。また、他の人が述べたように、ジェネリックを enum に制約することはできません

Description代わりに、拡張メソッドではなく、通常の静的メソッドとしてメソッドを呼び出す必要があります。

于 2013-06-06T11:11:52.743 に答える
1

LINQ を使用すると、これをエレガントに行うことができます。

public static void SetOptions<T>(this DropDownList dropDownList)
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("Type must be an enum type.");
    }

    dropDownList.Items.AddRange(Enum
        .GetValues(typeof(T))
        .Cast<Enum>()
        .Select(x => new ListItem(x.ToString(), Convert.ToInt32(x).ToString()))
        .ToArray());
}
于 2016-06-23T08:34:06.640 に答える
-3

ジェネリックと列挙値に関する Jan の回答を拡張するには、次のようにします。

void MyFunc<T>(T value)
{
    Type t = typeof(T);
    if(t.IsEnum)
    {
        int valueAsInt = value.GetHashCode(); // returns the integer value
    }
}
于 2015-05-17T13:18:01.160 に答える