获取.NET类中的枚举类型

时间:2015-09-23 14:46:21

标签: c# .net class reflection enums

考虑以下C#类声明:

public class MyClass {
    private enum Colours { Red, Green, Blue }
}

它位于一个单独的类库/ DLL中。

只给出了typeof(MyClass)对象(System.Type),有没有办法检查该类是否在运行时包含一个名为Colors的枚举,如果是,则返回它对应的System.Type对象?

我尝试做的是编写一些通用代码,它们给出类的类型并确定是否包含一个特定命名的枚举,然后查询枚举中的值。

我知道如何使用Reflection来查询GetFields,GetProperties等内容,但System.Type中没有GetClasses或GetEnums方法。

我怀疑这种信息是在集会中吗?

3 个答案:

答案 0 :(得分:9)

只是做:

var res = typeof(MyClass).GetNestedType("Colours", BindingFlags.NonPublic);

测试res != null以查看此类型是否存在。

然后测试res.IsEnum以查看嵌套类型是否为枚举。

添加:如果嵌套类型偶尔嵌套在公共场所,请改用BindingFlags.NonPublic | BindingFlags.Public

答案 1 :(得分:2)

我想出了以下两种方法:

public class MyClass {
    private enum Colours { Red, Green, Blue }

    private class Inner {
        private enum Colours { Black, White }
    }
}

class Program {
    static void Main(string[] args) {
        Type coloursType;
        // 1. enumerator
        coloursType = typeof(MyClass).EnumerateNestedTypes()
            .Where(t => t.Name == "Colours" && t.IsEnum)
            .FirstOrDefault();
        // 2. search method
        coloursType = typeof(MyClass).FindNestedType(t => t.Name == "Colours" && t.IsEnum);

        if(coloursType != null) {
            Console.WriteLine(string.Join(", ", coloursType.GetEnumNames()));
        } else {
            Console.WriteLine("Type not found");
        }
        Console.ReadKey();
    }
}

public static class Extensions {
  public static IEnumerable<Type> EnumerateNestedTypes(this Type type) {
        const BindingFlags flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic;
        Queue<Type> toBeVisited = new Queue<Type>();
        toBeVisited.Enqueue(type);
        do {
            Type[] nestedTypes = toBeVisited.Dequeue().GetNestedTypes(flags);
            for(int i = 0, l = nestedTypes.Length; i < l; i++) {
                Type t = nestedTypes[i];
                yield return t;
                toBeVisited.Enqueue(t);
            }
        } while(toBeVisited.Count != 0);
    }

    public static Type FindNestedType(this Type type, Predicate<Type> filter) {
        const BindingFlags flags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic;
        Type[] nestedTypes = type.GetNestedTypes(flags);
        foreach(var nestedType in nestedTypes) {
            if(filter(nestedType)) {
                return nestedType;
            }
        }
        foreach(var nestedType in nestedTypes) {
            Type result = FindNestedType(nestedType, filter);
            if(result != null) {
                return result;
            }
        }
        return null;
    }
}

答案 2 :(得分:-1)

var types = typeof(MyClass).Assembly.DefinedTypes;

foreach (var type in types)
{
    Console.WriteLine(type.Name);
}

输出:

  

MyClass的
  颜色