2008-12-18 10 views
23

Oto podstawowa sytuacja.Uzyskaj całkowitą wartość wyliczenia, która jest generyczna

Public Class MyEnumClass(of T) 
    Public MyValue as T 
End Class 

Jest to ogromna uproszczeniem rzeczywistej klasy, ale po prostu wiem, że T jest wyliczenie (jeśli nie to nie będzie wiele innych problemów jest, a to błąd logiczny wykonany przez programistę)

Zasadniczo chcę uzyskać wartość całkowitą MyValue.

Używanie Cint lub Ctype, nie działa.

+0

ja całkowicie błędnie odczytać wyliczenie jako IEnumerable :( –

Odpowiedz

40

miałem zamiar użyć fajny kawałek kodu refleksji, ale tylko prosty Convert.ToInt32 działa świetnie ... Wybaczcie moją VB Jestem C# facet

Public Function GetEnumInt(Of T)(enumVal As T) As Integer 
    Return Convert.ToInt32(enumVal) 
End Function 
6

Próbowałem to i to działało:

String.Format("{0:d}", MyValue) 
+9

dobrze, że przekształca go w ciąg * * - Myślałem, że chcesz go jako liczbę całkowitą –

3

wiem, można wykonać następujące czynności, aby uzyskać wszystkie wartości bazowe (mam nadzieję, że moje składnia VB jest poprawna ... Pracuję głównie w C# późno):

Dim intVal As Integer 

For Each intVal In [Enum].GetValues(GetType(T)) 
    //intValue is now the enum integer value 
Next 

To może przynajmniej sprawić, że zaczniesz we właściwym kierunku.

0

Innym prostym sposobem w VB.NET jest dodać go do 0:

Dim intVal As Integer = 0 + myEnum 

Tak, to powinno działać:

Sub GetEnumInt(of T)(enumVal as T) as Int 
    return 0 + enumVal 
End Sub 
+0

To nie zadziała, gdy ' myEnum' jest typu generycznego typu parametru, ponieważ kompilator nie wie, czy faktycznie jest wyliczeniem, a zatem nie będzie typować operatora '+'. –

+1

Nie działa z opcją 'Option Strict On'. – mbomb007

0

Dzięki "Jon Skeet". Ale jego kod nie działa w moim Excel-2016. Minwhile następny kod działa poprawnie:

Public Enum TypOfProtectWs 
    pws_NotFound = 0 
    pws_AllowAll = 1 
    pws_AllowFormat = 2 
    pws_AllowNone = 3 
End Enum 

Private Function TypOfProtectWs2I(pws As TypOfProtectWs) As Integer 
    TypOfProtectWs2I = Format("0", pws) 
End Function 

Private Sub test_TypOfProtectWs2I() 
    Debug.Print TypOfProtectWs2I(pws_AllowAll) 
End Sub 
Powiązane problemy