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

时间:2013-08-06 01:31:31

标签: c# generics casting ienumerable

我有一个返回所有枚举值的方法(但这不是重要的)。重要的是它需要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 ));

这甚至可能吗?

1 个答案:

答案 0 :(得分: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