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
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)));
¿Qué hay de malo en la System.Convert clase ya existente y la interfaz IConvertible?
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.
+1 - Método interesante para extender IConvertible a tipos no convertibles. –
Hay un overview of type conversions at MSDN donde se puede obtener más información sobre el tema. Lo he encontrado útil.
- 1. C#, tipo de retorno dinámico
- 2. C conversiones aritméticas habituales
- 3. C# conversiones implícitas
- 4. conversiones de tipo de punto flotante C++ a entero
- 5. C++ conversiones de automóviles
- 6. C++ conversiones implícitas
- 7. Limitaciones del tipo dinámico en C#
- 8. Conversiones entre tipos de datos en C#
- 9. fundición de tipo dinámico en parámetro en C#
- 10. Cómo desempacar un objeto de C# para el tipo dinámico
- 11. Conversiones definidas por el usuario en C++
- 12. ¿Qué conversiones de tipo Javascript están pasando aquí?
- 13. Conversiones de tipo en Ruby: ¿la forma "correcta"?
- 14. Las aplicaciones más comunes del tipo dinámico C# 4.0
- 15. C#: análisis dinámico de System.Type
- 16. ¿Cómo crear un tipo dinámico propio o un objeto dinámico en C#?
- 17. Operador con C# dinámico?
- 18. Reflect.Emit Tipo dinámico Blowup de memoria
- 19. Encuadernación de tipo estático Vs Encuadernación de tipo dinámico
- 20. Obtener las propiedades de un tipo dinámico
- 21. ¿Qué es el tipo dinámico de objeto?
- 22. Intérpretes e idiomas de tipo dinámico
- 23. DataContract y tipo de retorno dinámico WCF
- 24. Envoltura C++ en C: derivadas a conversiones base
- 25. Definición de conversiones implícitas y explícitas para interfaces C#
- 26. Buscar conversiones implícitas
- 27. C# indexador dinámico
- 28. ¿Por qué las conversiones implícitas C funcionan como lo hacen?
- 29. C# Suscripción de evento dinámico
- 30. ¿Qué hace el nuevo tipo dinámico scala?
En particular, Convert.ChangeType puede ser lo que buscas. – Noldorin