Benutzer mit den meisten Antworten
Ganze Enums an Funktion übergeben

Frage
-
Hallo,
ich möchte eine Function haben, an der ich eine komplette x-beliebige Enum-Liste übergeben kann. Also nicht "nur" einen einzelnen Wert, sondern "irgendeine" komplette Enumeration.
Ziel ist es, dass mir die Funktion alle Enum-Variablen (inkl. Namen und Wert) als Liste zurückliefert. Zur Verdeutlichung habe ich einen kleinen Quellcode angefügt wie ich mir das ungefähr vorstelle.
Mein Problem ist: Ich weiß nicht wie ich jede x-beliebige Enumeration an die Funktion übergebe, damit das funktioniert :-/ Ich habe es mit As Object probiert, mit As Type, As Enum etc.
Hier mein "Phantasie"-Quellcode :-)
Public Enum TestEnum Name1 = 1 Name2 = 3 HalloWelt = 12 End Enum Private Sub Test() Dim x As List(Of EnumItem) = GetNameAndValues(TestEnum) End Sub Public Function GetNameAndValues(e1 As Object) As List(Of EnumItem) Dim res As New List(Of EnumItem) Dim typ As Type = GetType(e1) Dim fields As FieldInfo() = typ.GetFields For Each field In fields If field.Name.Equals("value__") Then Continue For Dim x As New EnumItem x.Name = field.Name x.Value = field.GetRawConstantValue() res.Add(x) Next Return res End Function Public Class EnumItem Private _Name As String = "" Private _Value As Integer = 0 ''' <summary> ''' Name des Enum-Feldes ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Name As String Get Return _Name End Get Set(value As String) _Name = value End Set End Property ''' <summary> ''' Wert des Enum-Feldes ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Value As Integer Get Return _Value End Get Set(value As Integer) _Value = value End Set End Property End Class
Kann mir bitte da jemand auf die Sprünge helfen?
Vielen lieben dank
Gruß
Andy
Antworten
-
Hallo Andy,
Enum hat das zu guten Teilen bereits eingebaut. Eine Methode in der Zusammensetzung gibt es nicht, weil das Ergebnis nicht in jedem Falle eindeutig ist, nämlich wenn man ein Enum mit FlagsAttribute hat. Kann man damit leben und beschränkt sich auf Integer-Enumerationen, sähe das z. B. so aus:
Public Shared Function GetEnumNameAndValues(enumType As Type) As KeyValuePair(Of Integer, String)() Dim items As New List(Of KeyValuePair(Of Integer, String)) For Each value As Integer In [Enum].GetValues(enumType) items.Add(New KeyValuePair(Of Integer, String)(value, [Enum].GetName(enumType, value))) Next Return items.ToArray() End Function
Und als Beispiel:
For Each item In GetEnumNameAndValues(GetType(System.IO.FileAttributes)) Console.WriteLine("{0} = {1}", item.Key, item.Value) Next
Die Einschränkung auf Integer (oder kleiner) könnte man durch eine generische Methode aufheben, was das Ganze eher unhandlicher macht.
Alternativ zu KeyValuePair könnte man Tuple verwenden oder wie Du oben eine eigene Klasse erfinden.
Gruß Elmar
- Als Antwort markiert AndreasMahub Dienstag, 12. Februar 2013 19:44
Alle Antworten
-
Hallo Andreas,
suche mal mit Google "enumeration reflection" evtl. hilft dir das weiter.
http://www.distribucon.com/blog/GettingMembersOfAnEnumViaReflection.aspx
http://www.codeproject.com/Articles/31160/Enum-Reflection
http://msdn.microsoft.com/de-de/library/system.reflection.membertypes.aspx
http://geekswithblogs.net/shahed/archive/2006/12/06/100427.aspxKam mir dazu gerade in den Kopf.
Bietet sich dazu evtl. auch KeyValuePair an?
http://msdn.microsoft.com/de-de/library/vstudio/5tbh8a42.aspxGruss Peter
-
Hallo Andy,
Enum hat das zu guten Teilen bereits eingebaut. Eine Methode in der Zusammensetzung gibt es nicht, weil das Ergebnis nicht in jedem Falle eindeutig ist, nämlich wenn man ein Enum mit FlagsAttribute hat. Kann man damit leben und beschränkt sich auf Integer-Enumerationen, sähe das z. B. so aus:
Public Shared Function GetEnumNameAndValues(enumType As Type) As KeyValuePair(Of Integer, String)() Dim items As New List(Of KeyValuePair(Of Integer, String)) For Each value As Integer In [Enum].GetValues(enumType) items.Add(New KeyValuePair(Of Integer, String)(value, [Enum].GetName(enumType, value))) Next Return items.ToArray() End Function
Und als Beispiel:
For Each item In GetEnumNameAndValues(GetType(System.IO.FileAttributes)) Console.WriteLine("{0} = {1}", item.Key, item.Value) Next
Die Einschränkung auf Integer (oder kleiner) könnte man durch eine generische Methode aufheben, was das Ganze eher unhandlicher macht.
Alternativ zu KeyValuePair könnte man Tuple verwenden oder wie Du oben eine eigene Klasse erfinden.
Gruß Elmar
- Als Antwort markiert AndreasMahub Dienstag, 12. Februar 2013 19:44