0

ルートの文字列名で列挙型を参照したい。列挙型メンバーではなく、列挙型を参照したいことに注意してください。

列挙型メンバーをその名前で参照する方法を説明するスタックオーバーフローに関する多くの投稿があります (例: 名前 を指定して列挙型メンバーを取得する方法) が、ルートの名前で列挙型を参照する方法については見つかりませんでした。

さらに明確にするために;

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

列挙型を文字列に変換し、文字列に基づいて型を取得するコード ブロックを次に示します。タイプを取得する方法と、文字列をフォーマットする方法を示します。残りはかなり簡単です。

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 に答える
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 に答える
0

Enumがコードと同じ場所になかったため、Ricの答えはうまくいきませんでした。最終的に管理した方法は次のとおりです(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 に答える