Отражение значений Enum во внешней сборке - PullRequest
1 голос
/ 27 января 2011

Моя цель - перечислить библиотеки DLL в папке, найти классы, которые соответствуют определенному интерфейсу, а затем запросить эти классы для перечисления значений.Идея состоит в том, что я хочу узнать, какие возможности «Outcome» поддерживаются.

У меня есть свои DLL-библиотеки, и я вижу классы, которые соответствуют правильному интерфейсу, который работает, но следующий шаг -найти в классе конкретное перечисление и получить значения, я использовал следующий код:

Private Sub GetOutcomeEnumValues(ByVal AssemblyPath As String, ByVal ClassName As String)
        Dim ReflectedAssembly As Assembly
        Dim ReflectedClass As Type
        'Load DLL
        ReflectedAssembly = System.Reflection.Assembly.LoadFrom(AssemblyPath)
        'Load Class
        ReflectedClass = ReflectedAssembly.GetType(ClassName)
        'Load members
        Dim Members() As MemberInfo
        Members = ReflectedClass.GetMembers
        For i As Integer = 0 To Members.Count - 1
            'Check for the Outcomes enumeration
            If (Members(i).Name = "Outcomes") Then
                Dim Outcomes As System.Array
                Outcomes = Members(i).GetType.GetEnumValues
            End If
        Next
    End Sub

Проблема, с которой я столкнулся, заключается в том, что я не могу заставить участников (i) дать мне значения перечисления- хотя я ЗНАЮ, что этот участник - перечисление.Когда я вызываю 'GetEnumValues', возникает исключение:

"Предоставляемый тип должен быть Enum. Имя параметра: enumType"

Класс, который я запрашиваю, выглядит примерно так

Public Class Foo
    Public Enum Outcomes
        OK
        Cancel
    End Enum
End Class

1 Ответ

1 голос
/ 27 января 2011

Понял, немного поэкспериментировав, для хорошего эффекта использовал следующий код:

Private Sub GetOutcomeEnumValues(ByVal AssemblyPath As String, ByVal ClassName As String)
    Dim ReflectedAssembly As Assembly
    Dim ReflectedClass As Type
    'Load DLL
    ReflectedAssembly = System.Reflection.Assembly.LoadFrom(AssemblyPath)
    'Load Class
    ReflectedClass = ReflectedAssembly.GetType(ClassName & "+ Outcomes")
    'Load members
    Dim OutcomeNames() As String = ReflectedClass.GetEnumNames

End Sub
...