Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何通过它引用枚举';谁的字符串名?_Vb.net_Types_Enums - Fatal编程技术网

Vb.net 如何通过它引用枚举';谁的字符串名?

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,而不是enum成员

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

谢谢大家!

试一试,它会创建一个数组,以便您稍后可以将其更改为列表(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
}