Question

J'essaie de créer une méthode générique pour les conversions de types, qui permet d'obtenir un objet et le type d'objet à convertir.

En utilisant Convert.ChangeType () , je peux faire ce que je veux, mais cela prend trop de temps à l'exécution. Quelle est la meilleure méthode pour créer une classe générique comme je le souhaite?

Mon ancien code ressemble à ceci;

public static ConvertTo<T>(object data) where T : struct // yes the worst variable name!
{
  // do some controls...

  return Convert.ChangeType(data, typeof(T));
}

Modifier: Pour clarifier ...

Pour Ex; J'ai exécuté ma requête et il a renvoyé un DataRow. Et il y a une colonne dactylographiée décimale que je souhaite lancer. Si j'appelle cette méthode, la conversion décimale est longue en temps.

Et le type de cette méthode ne peut être que du type valeur. Je veux dire "T: struct"

Était-ce utile?

La solution

Je doute encore de vos performances. Voici des preuves. Compilez et exécutez le programme ci-dessous (en mode release):

using System;
using System.Diagnostics;

class Test
{
    const int Iterations = 100000000;

    static void Main()
    {
        Stopwatch sw = Stopwatch.StartNew();
        decimal d = 1.0m;
        long total = 0;
        for (int i=0; i < Iterations; i++)
        {
            long x = ConvertTo<long>(d);
            total += x;
        }
        sw.Stop();
        Console.WriteLine("Time: {0}ms", sw.ElapsedMilliseconds);
        Console.WriteLine("Total: {0}", total);
    }

    public static T ConvertTo<T>(object data) where T : struct
    {
        return (T) Convert.ChangeType(data, typeof(T));
    }
}

Cela prend 20 secondes sur mon ordinateur portable - pour exécuter 100 000 000 itérations. Il est difficile de croire qu'il faut 8 secondes sur votre ordinateur pour exécuter 40 itérations.

En d'autres termes, je soupçonne fortement que le problème ne se trouve pas là où vous le pensez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top