【问题标题】:Listing values within enums using reflection in C#在 C# 中使用反射列出枚举中的值
【发布时间】:2011-02-15 15:53:12
【问题描述】:

我正在尝试使用反射来列出一个 Visual Studio 解决方案中各种项目中几个类的公共成员和方法。我试图访问的所有类都是 C#,它们都是从 C# 类访问的。我用来进行这些调用的代码如下:

public void PopulateEventParamTree()
    {
        System.Console.WriteLine(source.GetType().ToString());
        Type type = (Type)source.getEventType();
        System.Console.WriteLine(type.ToString());

        foreach (MemberInfo member in type.GetMembers())
        {
            System.Console.WriteLine("\t" + member.ToString());
        }
    }

大多数输出​​都可以正常工作(即 Int32、Double、System.String)。我的问题是,当我尝试列出枚举时,控制台的输出如下所示:

Namespace.Subspace.event+EVENT_TYPE

我希望能够看到枚举的所有内部值,而不仅仅是其名称。例如,枚举

public enum EVENT_TYPE
{
    EVENTDOWN,
    EVENTMOVE,
    EVENTUP,
}

应该输出类似这样的东西

Namespace.Subspace.class+EVENT_TYPE EVENTDOWN
Namespace.Subspace.class+EVENT_TYPE EVENTMOVE
Namespace.Subspace.class+EVENT_TYPE EVENTUP

任何人都可以提供的任何帮助将不胜感激。到目前为止,我已经用尽了我所能找到的一切,但一个新的视角会很好。

谢谢

【问题讨论】:

    标签: c# windows reflection enums


    【解决方案1】:

    使用System.Enum.GetNames(typeof(EVENT_TYPE))

    您可能必须处理这种特殊情况(不使用枚举的反射)。

    【讨论】:

    【解决方案2】:

    如何通过反射获取枚举和值

    var importAssembly = System.Reflection.Assembly.LoadFile("test.dll");     
    Type[] types = importAssembly.GetTypes();
         foreach (Type type in types)
            {
            if (type.IsEnum)
            {
                   var enumName=type.Name;
                   foreach (var fieldInfo in type.GetFields())
                   {
                      if (fieldInfo.FieldType.IsEnum)
                      {
                          var fName=fieldInfo.Name;
                          var fValue=fieldInfo.GetRawConstantValue();
                      }
                  }
             }
        }
    

    【讨论】:

      【解决方案3】:

      因此,在您的情况下,检查 source 是否为枚举类型,然后调用 GetEnumNames() 将允许代码作用于类、枚举等。

          private void Work()
          {
              var type = typeof(numbers);
      
              string [] members;
      
              if(type.IsEnum)
                  members = typeof(numbers).GetEnumNames();
          }
      
          public enum numbers
          {
              one,
              two,
              three,
          }
      

      【讨论】:

        【解决方案4】:

        枚举被实现为公共静态只读字段(可能也是 const);您当前的代码应该可以工作...您只需要从 FieldInfo 获取名称。如果您想要该值,请调用 GetValue。

        不过,Enum.GetValues(type) 更简单...

        【讨论】:

          【解决方案5】:

          有一种方法可以在几行内调用

          public enum TestEnum // in some assembly there is some enum
          {
          
              A = 0,
              B,
              C
          }
          

          然后这个

          var assembly = Assembly.Load("TestCS");
          var converter = new EnumConverter(assembly.GetType("TestCS.TestEnum"));
          var enumValColl = converter.GetStandardValues();
          
          foreach (var val in enumValColl)
              Debug.WriteLine("{0} = {1}", val, (int)val);
          

          输出

          A = 0
          B = 1
          C = 2

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            • 1970-01-01
            • 1970-01-01
            • 2013-12-15
            • 1970-01-01
            • 2016-07-13
            相关资源
            最近更新 更多