2

すべての列挙値を返すメソッドがあります (ただし、これは重要ではありません)。重要な点は、 を受け取っTて返すということIEnumerable<T>です。

    private static IEnumerable<T> GetAllEnumValues<T>(T ob)
    {
        return System.Enum.GetValues(ob.GetType()).Cast<T>();
    }

また

    private static IEnumerable<T>  GetAllEnumValues<T>(T ob) 
    {
        foreach (var info in ob.GetType().GetFields(BindingFlags.Public | BindingFlags.Static))
        {
            yield return (T) info.GetRawConstantValue();
        }
    }

このメソッドを使用するには、クラスのインスタンスで呼び出す必要があります。この場合は、調査したい列挙型の任意の値を使用して呼び出します。

    GetAllEnumValues( Questions.Good );

メソッドのシグネチャを変更して、次のSystem.Typeように呼び出しできるようにしたいと思います。

    GetAllEnumValues( typeof(Questions ));

署名がどのように見えるかわかりません:

    private static IEnumerable<?>  GetAllEnumValues<?>(System.Type type) 

キャストを適用する方法、またはConvert.ChangeTypeこれを達成する方法。

電話したくないGetAllEnumValues<Questions>( typeof(Questions ));

これは可能ですか?

4

1 に答える 1

5

次のように、列挙型で指定できるオープン ジェネリック型を作成しないのはなぜですか。

private static IEnumerable<T> GetAllEnumValues<T>() 
{
    if(typeof(T).IsEnum)
        return Enum.GetValues(typeof(T)).Cast<T>();
    else
        return Enumerable.Empty<T>(); //or throw an exception
}

次に、列挙型を持つ

enum Questions { Good, Bad }

このコード

foreach (var question in GetAllEnumValues<Questions>())
{
    Console.WriteLine (question);
}

印刷されます:

Good
Bad
于 2013-08-06T01:37:03.810 に答える