2011-07-30 13 views
54

Duplicar posible:
is there a generic Parse() function that will convert a string to any type using parse?Cómo hacer una función de conversión de tipo genérico

Quiero hacer una función genérica para hacer algunas operaciones, como:

ConvertValue<T>(string value) 

Si T es int, la función convertirá el valor a int y devuelva el resultado.

mismo modo, si T es boolean, la función convertirá el value a boolean y lo devuelve.

¿Cómo escribir esto?

+6

¿Usted ha visto la clase Convert? No tiene sentido reinventar la rueda a menos que necesite algo especial. http://msdn.microsoft.com/en-us/library/system.convert(v=VS.85).aspx –

+0

Por cierto, eso es una conversión, no un elenco. –

+0

La conversión provoca que se llame al operador de conversión explícito de todos modos. –

Respuesta

151

¿Algo como esto?

public static T ConvertValue<T>(string value) 
{ 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

A continuación, puede utilizar de esta manera:

int val = ConvertValue<int>("42"); 

Editar:

incluso se puede hacer esto más genérico y no depender de un parámetro string suministra el modelo U implementa IConvertible - Esto significa que debe especificar dos parámetros de tipo:

public static T ConvertValue<T,U>(U value) where U : IConvertible 
{ 
    return (T)Convert.ChangeType(value, typeof(T)); 
} 

Consideré capturar la excepción InvalidCastException que podría ser elevada por Convert.ChangeType() - pero, ¿qué devolvería en este caso? default(T)? Parece más apropiado que la persona que llama trate la excepción.

+3

Bien hecho. Sin embargo, solo una nota de uso: no se olvide de implementar el manejo de excepciones para las conversiones no admitidas. –

+3

@Evan: vea mi actualización - Creo que la persona que llama debería manejar esta excepción ya que no hay una buena manera de manejarlo dentro del método de conversión - devolviendo los sonidos 'default (T)' incorrectos. – BrokenGlass

+0

@BrokenGlass: estoy de acuerdo. No hay una manera limpia de manejarlo dentro del método de ayuda. Si estuviera usando esto, rodearía la llamada con un bloque 'try-catch'. –

-2

ConvertValue (System.Object o), a continuación, puede ramificar por o.GetType() resultado y up-cast o a los tipos para trabajar con el valor.

+1

OP específicamente solicitó algo utilizando genéricos – iandotkelly

6

Aunque probablemente no sea tan limpia mirando el enfoque IConvertible, se puede utilizar siempre la comprobación directa typeof(T) para regresar el T:

public static T ReturnType<T>(string stringValue) 
{ 
    if (typeof(T) == typeof(int)) 
     return (T)(object)1; 
    else if (typeof(T) == typeof(FooBar)) 
     return (T)(object)new FooBar(stringValue); 
    else 
     return default(T); 
} 

public class FooBar 
{ 
    public FooBar(string something) 
    {} 
} 
+0

Esta técnica es útil cuando desea una lógica especializada para ciertos tipos –

Cuestiones relacionadas