Nous avons 2 objets A & B: A est system.string et B est un type primitif .net (string, int etc.). nous voulons écrire du code générique pour assigner la valeur convertie (analysée) de B en A. Des suggestions? Merci, Adi BardaConversions de type dynamique C#
Répondre
La façon la plus pragmatique et souple pour faire les conversions de chaînes est avec TypeConverter
:
public static T Parse<T>(string value)
{
// or ConvertFromInvariantString if you are doing serialization
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}
Plus de types ont le même type convertisseurs de mettre en œuvre IConvertible
etc, et vous pouvez également ajouter des convertisseurs à de nouveaux types - les deux à compile- temps;
[TypeConverter(typeof(MyCustomConverter))]
class Foo {...}
class MyCustomConverter : TypeConverter {
// override ConvertFrom/ConvertTo
}
et aussi à l'exécution si vous avez besoin (pour les types que vous ne possédez pas):
TypeDescriptor.AddAttributes(typeof(Bar),
new TypeConverterAttribute(typeof(MyCustomConverter)));
Quel est le problème avec la classe System.Convert déjà existante et l'interface IConvertible?
Comme déjà mentionné, System.Convert et IConvertible serait le premier pari. Si, pour une raison quelconque, vous ne pouvez pas les utiliser (par exemple, si les conversions système par défaut pour les types prédéfinis ne vous conviennent pas), vous pouvez créer un dictionnaire qui contient des délégués pour chaque conversion et effectuer une recherche dans trouver la bonne conversion en cas de besoin.
Par exemple; lorsque vous souhaitez convertir chaîne en type X, vous pouvez disposer des éléments suivants:
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) } };
}
De toute évidence, vous auriez probablement eu envie de faire quelque chose de plus intéressant dans vos routines de conversion personnalisés, mais il montre le point.
+1 - Approche intéressante pour étendre les types IConvertible aux types non-convertissables. –
Il y a un overview of type conversions at MSDN où vous pouvez obtenir plus d'informations sur le sujet. Je l'ai trouvé utile.
- 1. Conversions implicites C++
- 2. C# Conversions d'octets
- 3. Conversions implicites de classe
- 4. C# objet dynamique d'exécution de type Vérification
- 5. Vs IConvertible. conversions de type opérateur implicite/explicite?
- 6. De plus grands nombres entiers à moins de conversions de type non signés en C
- 7. C# Type Dynamique dans une propriété GenericCollection
- 8. Paramètre de propriété de type primitive dynamique dans l'objectif C
- 9. Le compilateur C# effectuera-t-il plusieurs conversions implicites pour passer d'un type à un autre?
- 10. signé conversions non signées
- 11. conversions tableau Javascript
- 12. Extension dynamique d'un type lors de l'exécution?
- 13. type retour dynamique d'une fonction
- 14. Haxe et tableaux Type dynamique
- 15. Conversion de type en C#
- 16. Coulée dynamique en C#
- 17. déclaration générique dynamique de type T
- 18. Dactylographie dynamique en C#
- 19. Arbres d'expression C# - Recherche de valeur dynamique
- 20. Modification dynamique d'un type d'éditeur pour ASPxGridView
- 21. Webservice C# .NET dynamique
- 22. Contrôle dynamique dans C#
- 23. Arguments d'attribut dynamique C#
- 24. Opérateur dynamique C#
- 25. Répéteur dynamique en C# .net
- 26. Une méthode générique pour définir la longueur d'un tableau dynamique de type arbitraire en C++
- 27. Rails - Suivi des renvois aux conversions
- 28. Déclaration de déclarations de mémoire dynamique C++
- 29. Comment automatiser les conversions HTML vers PDF?
- 30. Comment définir une valeur d'un champ de type dynamique
En particulier, Convert.ChangeType peut être ce que vous recherchez. – Noldorin