如何获取定义的枚举数?

时间:2018-04-20 02:45:51

标签: c# enums

我有3枚Enum。 MyEnumA,MyEnumB,MyEnumC。

我需要确定类或名称空间中的Enum数量。

代码应返回3.

enum MyEnumA{ }
enum MyEnumB{ }
enum MyEnumC{ }

2 个答案:

答案 0 :(得分:3)

您可以使用反射从程序集中获取类型。我将包含一个控制台应用程序,它将获取执行程序集中的所有枚举类型,计算它们,并打印正确的值。请注意,这可能会根据框架而改变,例如在UWP中获取类型(GetTypes())只是略有不同。总的来说,我认为这个控制台应用示例可以回答您的问题。

简单示例:

using System;
using System.Linq;
using System.Reflection;

namespace Question_Answer_Console_App
{
    class Program
    {
        static void Main(string[] args)
        {
            var enumsInAssembly = Assembly.GetExecutingAssembly()
                                          .GetTypes()
                                          .Where(type => type.IsEnum);

            Console.WriteLine(enumsInAssembly.Count());
            Console.Read();
        }
    }

    enum MyEnumA { }
    enum MyEnumB { }
    enum MyEnumC { }
}

<强>输出:

3

以下是同一示例应用程序的更深入版本,它将帮助您浏览命名空间和类(正如您可能希望搜索特定命名空间或类的注释中所指出的那样)。查看此示例应该帮助您编写或了解如何编写所需的正确逻辑以获得所需的结果。无论哪种方式,只需知道在搜索类型,属性,修饰符,ETC的程序集时所需的一切;是通过反射找到的。

更深的例子:

using System;
using System.Linq;
using System.Reflection;

namespace Question_Answer_Console_App
{
    class Program
    {
        static void Main(string[] args)
        {
            var assemblyTypes = Assembly.GetExecutingAssembly()
                                        .GetTypes()
                                        .OrderBy(type => type.Name);

            var namespacesInAssembly = assemblyTypes.Select(type => type.Namespace)
                                                    .Distinct()
                                                    .OrderBy(name => name);

            var enumsInAssembly = assemblyTypes.Where(type => type.IsEnum)
                                               .OrderBy(type => type.Name); ;

            var enumsInNamespaceB = enumsInAssembly.Where(@enum => @enum.Namespace.EndsWith(nameof(NamespaceB)))
                                                   .OrderBy(type => type.Name); ;

            var enumsInClassC = assemblyTypes.Where(type => type.IsClass)
                                             .Where(type => type.Name == nameof(NamespaceC.ClassC))
                                             .SelectMany(type => type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic))
                                             .Where(type => type.IsEnum)
                                             .OrderBy(type => type.Name);

            foreach (var @namespace in namespacesInAssembly)
                Console.WriteLine($"Namespace found: {@namespace}");

            Console.WriteLine();
            Console.WriteLine($"Enums in Assembly: {enumsInAssembly.Count()}");
            Console.WriteLine();
            Console.WriteLine($"Enums in Namespace B: {enumsInNamespaceB.Count()}");
            Console.WriteLine();
            Console.WriteLine($"Enums in Class C: {enumsInClassC.Count()}");
            Console.WriteLine();

            foreach (var x in enumsInClassC)
                Console.WriteLine(x.Name);

            Console.Read();
        }
    }

    namespace NamespaceA
    {
        enum MyEnumA { }
    }

    namespace NamespaceB
    {
        enum MyEnumB { }
    }

    namespace NamespaceC
    {
        public class ClassC
        {
            enum MyEnumC { }
            enum MyEnumD { }
        }
    }
}

<强>输出:

Namespace found: Question_Answer_Console_App
Namespace found: Question_Answer_Console_App.NamespaceA
Namespace found: Question_Answer_Console_App.NamespaceB
Namespace found: Question_Answer_Console_App.NamespaceC

Enums in Assembly: 4

Enums in Namespace B: 1

Enums in Class C: 2

MyEnumC
MyEnumD

答案 1 :(得分:0)

你可以用通用方法编写它来定位classassemblynamespace

示例

  private static int GetEnumCountFromClass<T>()
  {
    return typeof(T).GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
         .Count(x => x.IsEnum);
  }

  private static int GetEnumFromAssembly(Assembly assembly, string nameSpace = null)
  {
     assembly = assembly ?? Assembly.GetExecutingAssembly();
     var types = assembly.GetTypes().AsEnumerable();

     if (nameSpace != null)
     {
        types = types.Where(x => x.Namespace == nameSpace);
     }
     return types.Count(x => x.IsEnum);

  }

用法

public static void Main(string[] args)
{
   Console.WriteLine("Enum Count from class : " + GetEnumCountFromClass<Program>());
   Console.WriteLine("Enum Count from assembly : " + GetEnumFromAssembly(Assembly.GetExecutingAssembly()));
}

Full Demo Here

Type.GetNestedTypes Method

  

获取嵌套在当前Type中的类型。

BindingFlags Enumeration

  

指定控制绑定的标志以及搜索的方式   成员和类型是通过反思进行的。

Assembly.GetTypes Method

  

获取此程序集中定义的类型。