Determine if a Type is a Generic List of Enum Types
在的需要来确定的,如果一个给定类型的一个列表,如果通用的枚举类型。
在IP是用下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void Main() { TestIfListOfEnum(typeof(int)); TestIfListOfEnum(typeof(DayOfWeek[])); TestIfListOfEnum(typeof(List<int>)); TestIfListOfEnum(typeof(List<DayOfWeek>)); TestIfListOfEnum(typeof(List<DayOfWeek>)); TestIfListOfEnum(typeof(IEnumerable<DayOfWeek>)); } void TestIfListOfEnum(Type type) { Console.WriteLine("Object Type: "{0}", List of Enum: {1}", type, IsListOfEnum(type)); } bool IsListOfEnum(Type type) { var itemInfo = type.GetProperty("Item"); return (itemInfo != null) ? itemInfo.PropertyType.IsEnum : false; } |
这里的输出从上面的代码:
1 2 3 4 5 6 | Object Type:"System.Int32", List of Enum: False Object Type:"System.DayOfWeek[]", List of Enum: False Object Type:"System.Collections.Generic.List`1[System.Int32]", List of Enum: False Object Type:"System.Collections.Generic.List`1[System.DayOfWeek]", List of Enum: True Object Type:"System.Collections.Generic.List`1[System.DayOfWeek]", List of Enum: True Object Type:"System.Collections.Generic.IEnumerable`1[System.DayOfWeek]", List of Enum: False |
所有的输出冰到底想要什么我最后的实例。它不检测,
美国能源部的人知道如何在现场检测的枚举类型的实例在这货吗?
如果要测试给定类型的
首先,获取可枚举类型的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public static IEnumerable<Type> GetEnumerableTypes(Type type) { if (type.IsInterface) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { yield return type.GetGenericArguments()[0]; } } foreach (Type intType in type.GetInterfaces()) { if (intType.IsGenericType && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { yield return intType.GetGenericArguments()[0]; } } } |
然后:
1 2 3 4 | public static bool IsEnumerableOfEnum(Type type) { return GetEnumerableTypes(type).Any(t => t.IsEnum); } |
您可以这样得到
1 | Type enumerableType = enumerable.GetType().GenericTypeArguments[0]; |
然后,您可以通过检查该类型是否可分配给
1 |
下面是一个简单的方法:
1 2 3 4 5 6 |
基本上,提取类型实现的所有接口,找到所有
如果