2008-12-18 6 views
23

Aquí está la situación básica.Obtenga el valor entero de una enumeración que es un genérico

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

Esta es enorme simplificación excesiva de la clase real, pero en el fondo sé que T es una enumeración (si no, entonces habrá muchos otros problemas es, y es un error lógico realizado por el programador)

Básicamente quiero obtener el valor entero subyacente de MyValue.

El uso de Cint o Ctype, no funciona.

+0

estoy totalmente de enumeración lectura errónea como IEnumerable :( –

Respuesta

40

que iba a utilizar una pieza fresca de código de reflexión, sino sólo un simple Convert.ToInt32 funciona muy bien ... Perdona mi VB Soy un tipo C#

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

yo probamos este y funcionó:

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

bien que la convierte en una cadena * * - pensé que lo quería como un entero –

3

Sé que usted puede hacer lo siguiente para obtener todos los valores subyacentes (espero que mi sintaxis VB es correcto ... He estado trabajando en C# en su mayoría en los últimos tiempos):

Dim intVal As Integer 

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

Eso al menos podría comenzar en la dirección correcta.

0

Otra forma sencilla en VB.NET es añadirlo a 0:

Dim intVal As Integer = 0 + myEnum 

lo tanto, esto debería funcionar:

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

Esto no funcionará cuando ' myEnum' es de tipo de parámetro de tipo genérico, porque el compilador no sabe si en realidad es una enumeración y, por lo tanto, no realiza la comprobación del operador '+'. –

+1

Esto no funciona con 'Option Strict On'. – mbomb007

0

Gracias a 'Jon Skeet'. Pero su código no funciona en mi Excel-2016. Minwhile el siguiente código funciona bien:?

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 
Cuestiones relacionadas