Преобразование типов в C # - PullRequest
4 голосов
/ 25 ноября 2008

Я пытаюсь создать универсальный метод для преобразования типов, который получает объект и тип объекта для приведения.

Используя Convert.ChangeType(), я могу делать то, что хочу, но это занимает слишком много времени во время выполнения. Каков наилучший метод для создания универсального класса, как я хочу.

Мой старый код выглядит так;

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

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

Edit: Чтобы уточнить ...

Например; Я выполнил свой запрос, и он вернул DataRow. И есть столбец, который напечатан как десятичный, который я хочу привести к длинному. Если я вызываю этот метод, требуется много времени, чтобы привести десятичную к длинной.

И тип T этого метода может быть только типом значения. Я имею в виду "T: struct"

1 Ответ

3 голосов
/ 25 ноября 2008

Я все еще сомневаюсь в ваших претензиях к производительности. Вот доказательства. Скомпилируйте и запустите программу ниже (в режиме выпуска):

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

Это займет 20 секунд на моем ноутбуке - выполнить 100 000 000 итераций. Трудно поверить, что на вашем компьютере для выполнения 40 итераций требуется 8 секунд.

Другими словами, я сильно подозреваю, что проблема не там, где вы думаете.

...