关于c#:确定Type是枚举类型的通用列表

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

所有的输出冰到底想要什么我最后的实例。它不检测,typeof(IEnumerable)is a collection of枚举类型。

美国能源部的人知道如何在现场检测的枚举类型的实例在这货吗?


如果要测试给定类型的IEnumerable类型,其中Tenum类型,可以执行以下操作。

首先,获取可枚举类型的方法:

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);
    }


您可以这样得到IEnumerable的类型:

1
Type enumerableType = enumerable.GetType().GenericTypeArguments[0];

然后,您可以通过检查该类型是否可分配给enum类型的变量(枚举的基类)来测试它是否是枚举:

1
typeof(Enum).IsAssignableFrom(enumerableType)


下面是一个简单的方法:

1
2
3
4
5
6
public static bool TestIfSequenceOfEnum(Type type)
{
    return (type.IsInterface ? new[] { type } : type.GetInterfaces())
        .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        .Any(i => i.GetGenericArguments().First().IsEnum);
}

基本上,提取类型实现的所有接口,找到所有IEnumerable,如果这些T中的任何一个是枚举,则返回true。记住,一个具体的类可以实现多次IEnumerable(使用不同的T)。

如果type是一个类或者是一个接口,这两种方法都有效。