2009-03-15 25 views
6

Tenemos 2 objetos A & B: A es system.string y B es algún tipo primitivo .net (cadena, int, etc.). queremos escribir un código genérico para asignar el valor convertido (analizado) de B a A. ¿Alguna sugerencia? Gracias, Adi Bardaconversiones de tipo dinámico C#

Respuesta

20

La manera más pragmática y versátil que puede hacer la conversión de series es con TypeConverter:

public static T Parse<T>(string value) 
{ 
    // or ConvertFromInvariantString if you are doing serialization 
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value); 
} 

Más tipos tienen convertidores tipo de implementar IConvertible etc, y también se puede añadir a los convertidores nuevos tipos - por lo tanto de compilación hora;

[TypeConverter(typeof(MyCustomConverter))] 
class Foo {...} 

class MyCustomConverter : TypeConverter { 
    // override ConvertFrom/ConvertTo 
} 

y también en tiempo de ejecución si es necesario (para tipos que no posee):

TypeDescriptor.AddAttributes(typeof(Bar), 
    new TypeConverterAttribute(typeof(MyCustomConverter))); 
5

Como ya se mencionó, System.Convert e IConvertible serían la primera apuesta. Si por alguna razón no puede usarlos (por ejemplo, si las conversiones de sistema predeterminadas para los tipos integrados no son adecuadas para usted), un enfoque es crear un diccionario que contenga delegados a cada conversión, y hacer una búsqueda en eso para encuentre la conversión correcta cuando sea necesario.

Por ejemplo; cuando se quiere convertir de cadena a tipo X que podría tener el siguiente:

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine(SimpleConvert.To<double>("5.6")); 
     Console.WriteLine(SimpleConvert.To<decimal>("42")); 
    } 
} 

public static class SimpleConvert 
{ 
    public static T To<T>(string value) 
    { 
     Type target = typeof (T); 
     if (dicConversions.ContainsKey(target)) 
      return (T) dicConversions[target](value); 

     throw new NotSupportedException("The specified type is not supported"); 
    } 

    private static readonly Dictionary<Type, Func<string, object>> dicConversions = new Dictionary <Type, Func<string, object>> { 
     { typeof (Decimal), v => Convert.ToDecimal(v) }, 
     { typeof (double), v => Convert.ToDouble(v) } }; 
} 

Obviamente, es probable que desee hacer algo más interesante en sus rutinas de conversión de costumbre, sino que demuestra el punto.

+0

+1 - Método interesante para extender IConvertible a tipos no convertibles. –

Cuestiones relacionadas