0

我想通过根的字符串名称来引用枚举。请注意,我希望引用枚举,而不是枚举成员。

stackoverflow 上有很多帖子描述了如何通过其名称来引用枚举成员(例如 ,如何根据其名称检索枚举成员),但我没有找到任何关于如何通过其根名称来引用枚举的信息。

进一步澄清;

Enum MyEnumA : Quiet : Noisy : End enum
Enum MyEnumB : Big : Small : Gigantic : End enum

Sub Foo(strAction as string)
    ' Depending on value of strAction, i want to create a list of either MyEnumA or MyEnumB members
    ' I know i can't do the following, it's just to make clear the direction i'm wanting to go -
    Dim lstMembers As New List(Of CType(strAction,[Enum]))   
    '....
end function

按照下面的好建议,我已经尝试过了;

Dim enumType As Type = System.Type.GetType("ExcelInterface.clsBTAnalyseRslts+" & "strAction")
Dim lstFldIndx As New List(Of enumtype)   'Fails to compile this line as doesn't recognize enumtype as defined

谢谢!

4

3 回答 3

1

试一试,它会创建一个数组,以便您稍后将其更改为 List(Of x...):

Sub Foo(ByVal strAction As String)

    Dim exAssembly = Reflection.Assembly.GetExecutingAssembly

    Dim enumType = exAssembly.GetTypes.First(Function(f) f.Name = strAction)

    Dim myEnum = [Enum].GetValues(enumType)

End Sub

我在这里找到了一个有趣的帖子,它给了我一些方向。

用法:

Foo("MyEnumA")

我会让你做一些错误处理和检查:D

于 2012-11-23T10:10:16.177 回答
1

这是一个代码块,它将枚举转换为字符串,然后根据字符串获取类型。它将向您展示如何获取类型以及如何格式化字符串。其余的应该很简单。

Dim obj As MyEnumA
Dim t As Type = obj.GetType()
Dim s As String = t.FullName
Dim t2 As Type = System.Type.GetType(s)

然后执行此操作以获取值:

Dim Members() As String
Members = System.Enum.GetNames(t2)

变量 s 看起来像这样“namespace.class + MyEnumA”,所以你需要做的就是以编程方式创建这个字符串并将它发送到一个函数。

于 2012-11-23T10:30:15.650 回答
0

Ric 的回答对我来说不太奏效,因为我的 Enum 与我的代码不在同一个位置,所以这就是我最终管理它的方式(我使用 VB,但我将添加 C# 以供参考):

VB

Dim EnumName As String = "MyEnum"
Dim MyAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetAssembly(GetType(My.Assembly.Location))
Dim MyEnum As System.Type = MyAssembly.GetType("My.Assembly.Location+ClassName+" & EnumName)
Dim EnumNames As String() = MyEnum.GetEnumNames()
For intVal As Integer = 0 To EnumNames.Length - 1
    ' EnumNames(intVal) = Name of Enum Value
    ' intVal = Enum Value
Next

C#

string EnumName = "MyEnum";
System.Reflection.Assembly MyAssembly = System.Reflection.Assembly.GetAssembly(typeof(My.Assembly.Location));
System.Type MyEnum = MyAssembly.GetType("My.Assembly.Location+ClassName+" + EnumName);
string[] EnumNames = MyEnum.GetEnumNames();
for (int intVal = 0; intVal <= EnumNames.Length - 1; intVal++) {
    // EnumNames(intVal) = Name of Enum Value
    // intVal = Enum Value
}

希望它会节省某人的宝贵时间:)。

于 2015-04-09T11:19:05.257 回答