取一个System.Type并返回此类型的IEnumerable

tym*_*tam 2 c# generics ienumerable casting

我有一个返回所有枚举值的方法(但这不是重要的).重要的是它需要T并返回IEnumerable<T>.

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

要么

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

要使用此方法,您需要使用类的实例调用它 - 在本例中,使用我们要探索的枚举中的任何值:

    GetAllEnumValues( Questions.Good );
Run Code Online (Sandbox Code Playgroud)

我想更改方法的签名以获取System.Typein并能够像这样调用它:

    GetAllEnumValues( typeof(Questions ));
Run Code Online (Sandbox Code Playgroud)

我不知道签名会是什么样子:

    private static IEnumerable<?>  GetAllEnumValues<?>(System.Type type) 
Run Code Online (Sandbox Code Playgroud)

以及如何申请铸造或Convert.ChangeType实现这一目标.

我不想打电话 GetAllEnumValues<Questions>( typeof(Questions ));

这甚至可能吗?

Ily*_*nov 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
}
Run Code Online (Sandbox Code Playgroud)

然后有枚举

enum Questions { Good, Bad }
Run Code Online (Sandbox Code Playgroud)

这段代码

foreach (var question in GetAllEnumValues<Questions>())
{
    Console.WriteLine (question);
}
Run Code Online (Sandbox Code Playgroud)

将打印:

Good
Bad
Run Code Online (Sandbox Code Playgroud)