Domanda

Sto cercando di creare un metodo generico per le conversioni di tipo che ottenga un oggetto e il tipo di oggetto da trasmettere.

Utilizzando Convert.ChangeType () posso fare quello che voglio, ma ci vuole troppo tempo in fase di esecuzione. Qual è il metodo migliore per creare una classe generica come la voglio io.

Il mio vecchio codice appare così;

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

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

Modifica: Per chiarire ...

Per Ex; Ho eseguito la mia query e ha restituito un DataRow. E c'è una colonna che è stata digitata come decimale e che voglio lanciare a lungo. Se chiamo questo metodo, ci vuole così tanto tempo per lanciare i decimali a lungo.

E il tipo T di questo metodo potrebbe essere solo un tipo di valore. Intendo " T: struct "

È stato utile?

Soluzione

Dubito ancora delle tue dichiarazioni sul rendimento. Ecco le prove. Compilare ed eseguire il programma seguente (in modalità di rilascio):

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

Il mio laptop impiega 20 secondi per eseguire 100.000.000 di iterazioni. È difficile credere che sul computer siano necessari 8 secondi per eseguire 40 iterazioni.

In altre parole, sospetto fortemente che il problema non sia dove pensi che sia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top