Pergunta

Eu estou tentando fazer um método genérico para conversões de tipo que recebe um objeto e o tipo de objeto a ser fundido.

Ao usar Convert.ChangeType() posso fazer o que eu quero, mas leva muito tempo em tempo de execução. Qual é o melhor método para fazer uma classe genérica como eu quero.

Os meus olhares de código antigos como isso;

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

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

Edit: Para esclarecer ...

Para Ex; Eu executada minha consulta e retornou um DataRow. E há uma coluna que digitado como decimal que eu quero elenco muito tempo. Se eu chamar esse método, que leva muito tempo para decimal elenco muito tempo.

Tipo

E T deste método poderia ser apenas tipo de valor. Quero dizer "T: struct"

Foi útil?

Solução

Eu ainda duvidar de suas reivindicações de desempenho. Aqui está a evidência. Compilar e executar o programa abaixo (em modo 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));
    }
}

Isso leva 20 segundos no meu laptop - para executar 100.000.000 iterações. É difícil de acreditar que ele leva 8 segundos no seu computador para executar 40 iterações.

Em outras palavras, eu suspeito fortemente que o problema não é onde você pensa que é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top