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