使用C#反射列出枚举中的值

11

我正在尝试使用反射来列出一个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

非常感谢大家能够提供任何帮助。我已经尽力搜索了所有能够找到的内容,但是一个新的视角会很好。

谢谢!

5个回答

15

@Craigt的回答 在你的情境下可能更准确。看一下它。 - Steve B

14

如何通过反射获取枚举和其对应的值

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
因此,在您的情况下,检查源是否为枚举类型,然后调用GetEnumNames()将允许代码对类、枚举等进行操作。
    private void Work()
    {
        var type = typeof(numbers);

        string [] members;

        if(type.IsEnum)
            members = typeof(numbers).GetEnumNames();
    }

    public enum numbers
    {
        one,
        two,
        three,
    }

3
枚举实现为公共的静态只读字段(可能也是常量);你当前的代码应该可以工作...你只需要从FieldInfo中获取名称。如果你想要值,调用GetValue即可。 然而,Enum.GetValues(type)更容易一些...

1

有一种方法可以用几行代码调用

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接