Vb.net 如何通过它引用枚举';谁的字符串名?
我想通过枚举根的字符串名引用枚举。请注意,我希望引用的是enum,而不是enum成员 stackoverflow上有许多帖子描述了如何通过名称引用枚举成员(例如 ),但我没有找到任何关于如何通过枚举的根名称引用枚举的信息 进一步澄清Vb.net 如何通过它引用枚举';谁的字符串名?,vb.net,types,enums,Vb.net,Types,Enums,我想通过枚举根的字符串名引用枚举。请注意,我希望引用的是enum,而不是enum成员 stackoverflow上有许多帖子描述了如何通过名称引用枚举成员(例如 ),但我没有找到任何关于如何通过枚举的根名称引用枚举的信息 进一步澄清 Enum MyEnumA : Quiet : Noisy : End enum Enum MyEnumB : Big : Small : Gigantic : End enum Sub Foo(strAction as string) ' Dependin
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
谢谢大家! 试一试,它会创建一个数组,以便您稍后可以将其更改为列表(x…): 我发现了一个有趣的帖子,它给了我一些方向 用法:
Foo("MyEnumA")
我将让您执行一些错误处理和检查:D这里有一个代码块,它将枚举转换为字符串,然后根据字符串获取类型。它将向您展示如何获取类型以及如何格式化字符串。其余的应该是非常直接的
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”,所以您需要做的就是以编程方式创建此字符串并将其发送给函数 Ric的答案对我来说不太合适,因为我的枚举与我的代码不在同一个位置,所以下面是我最终如何管理它的(我使用VB,但我将添加C#作为参考): VB 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);
字符串[]EnumNames=MyEnum.GetEnumNames();
对于(int intVal=0;intVal)您在列表中到底想要什么?是“EnumXXX”中每个值的名称,还是“EnumXXX”的每个值。在第一种情况下,您需要一个(字符串)列表和一个(整数)列表对于第二个案例。看起来是这样。并非出于恶意,而不仅仅是不了解系统。感谢您指出-将寻求纠正。我相信OP想要传递一个字符串,例如“MyEnumA”或者将任何其他枚举作为字符串,然后从枚举的每个成员处获取值。虽然我同意,但可能是错误的。要解决OPs问题,只需使用最后一行:Dim t2 as Type=System.Type.GetType(strAction)。但要使其正常工作,strAction需要是枚举类型的确切名称,前三行提供了该名称。他现在需要做的就是获取名称,查看它,然后从中创建字符串。在最终解决方案中,他不需要第1-3行,这只是一个帮助。尝试我的解决方案:创建枚举,复制我的函数并查看e将导致调试器。您应该能够在Dim myEnum=…行上看到枚举成员。哦,这是可行的,不要误解我,我不是说您的解决方案不好。我只是发现解决方案看起来过于复杂:)但您得到了额外的积分,因为您的实际使用的是“MyEnumA”,我的函数需要“namespace.class+MyEnumA”@WozzeC谢谢你的建议。我确实试过了,和Ric的建议类似,出于某种原因,它不能识别t2(或EnumType)。我会做GetType(MyEnumA),但我不会做GetType(t2)。创建一个列表也是如此。这几乎让我达到了目的,但我不能完全让它工作。这可以工作:Dim enumType As Type=Reflection.Assembly.getExecutionGassembly.GetTypes.First(函数(f)f.Name=“Fname”),但是如果我确实列出(枚举类型)或执行GetType(枚举类型),则会得到编译错误。错误表示未定义EnumType,情况显然并非如此。请保持函数不变,并在最后一行Dim myEnum=[Enum].GetValues(EnumType),在其下方为每个循环放置一个,并将myEnum中的每个项放入(字符串)列表中
Dim Members() As String
Members = System.Enum.GetNames(t2)
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
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
}