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.Type
in并能够像这样调用它:
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 ));
这甚至可能吗?
为什么不创建一个开放的泛型类型,您可以使用枚举指定,如下所示:
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)