Digita conversione in C #
-
11-07-2019 - |
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 "
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.