2010-03-04 10 views
8

Como C# no admite las funciones independientes, me resulta difícil encontrar un lugar para colocar las funciones de conversión. Por ejemplo, me gustaría convertir una enumeración en un número. En C++, haría la siguiente función independiente para esto:¿Dónde poner las funciones de conversión?

UINT32 ConvertToUint32(const MyEnum e); 

¿Cómo puedo hacer esto elegantemente en C#? ¿Debo hacer una clase ficticia estática para mantener la función, y si es así, cómo puedo encontrar un nombre significativo para ella? ¿O debería hacer una clase parcial Convertir?

¿Alguna idea?

Gracias de antemano.

Actualización: En retrospectiva, mi ejemplo no fue muy bien elegido, ya que existe una conversión predeterminada entre enum e int. Esto sería un mejor ejemplo:

Person ConvertToPerson(const SpecialPersonsEnum e); 
+1

MyEnum e = (MyEnum) 3; o MyInt i = (Int) e; son formas aceptables de convertir entre int y enum en C#.Dicho esto, siempre pongo mis funciones de conversión en una clase de utilidad. – jle

+0

+1 'clase parcial Convert' es una buena idea. –

+3

Si desea una conversión de una persona enum a una clase, ** escriba un operador de conversión **. ¿Por qué perder el tiempo con un método cuando puedes escribir un operador que hace lo que quieres? –

Respuesta

8

me gustaría ir con:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static int ConvertToInt(this MyEnum e) 
     { 
      var m; 

      // ... Implementation 

      return m; 
     } 
    } 
} 

Entonces será sólo tiene que utilizar MyEnum.ConvertToInt(); El mismo se puede hacer para múltiples conversiones de todo desde dentro de la misma clase. Los métodos de extensión son en resumen, malditamente sexy.


Además, Eric's comentario sobre convertidores de tipos me consiguió buscando en Google. Bastante impresionante, sin embargo, no estoy seguro de cómo usarlos con un Enum, pero para otras conversiones, están limpios como un silbido para implementar. Echar un vistazo aquí:

+0

Gracias por el ejemplo. –

1

Yo recomendaría que se crea y montaje que contendría todos sus ayudantes métodos/constantes y enumeraciones que serán utilizados en otros proyectos.

Esto le permitirá incluir fácilmente este conjunto con otros ensambles que lo necesiten y evitar las referencias circulares.

9

El ejemplo anterior parece un candidato para un Método de extensión.
Si eso no es posible, los defino como métodos estáticos en una clase estática; Normalmente los pondría en una clase estática llamada XXXHelper

+0

En este caso específico, un elenco estaría bien, en el caso general, estoy de acuerdo con Gishu y trato de usar métodos de extensión antes de generar una clase "ayudante". Mantenga la funcionalidad lo más cerca posible de su lugar (mientras mantiene SRP, por supuesto). –

+0

¡Tienes razón! No esperaba que los métodos de extensión funcionaran en las enumeraciones, pero aparentemente lo hacen. –

1

¿No puedes simplemente usar un molde para esto? (UInt32)e. O bien llamar Convert.ToUInt32(e)

+0

Sí, pero estoy hablando del caso general. Mi ejemplo fue simplemente para aclarar la situación. –

0

que se enfrentaron al problema similar una vez y me hicieron esto

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "123"; 
     int n = Convert.StringToInt(s); 
    } 
} 

class Convert 
{ 

    public static int StringToInt(string s) 
    { 
     // implementation 
    } 
    public static string IntToString(int n) 
    { 
     // implementation 
    } 
} 
+2

para eso ... ¿por qué no utilizas el .Net System.Convert Class? – SysAdmin

Cuestiones relacionadas