2009-03-15 6 views
6

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

20

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))); 
3

Quel est le problème avec la classe System.Convert déjà existante et l'interface IConvertible?

+4

En particulier, Convert.ChangeType peut être ce que vous recherchez. – Noldorin

5

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.

+0

+1 - Approche intéressante pour étendre les types IConvertible aux types non-convertissables. –

Questions connexes