Преобразование типов в C#

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

Используя 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));
}

Изменить: Чтобы уточнить...

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

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


person Ali Ersöz    schedule 25.11.2008    source источник
comment
Можете ли вы быть немного более конкретным, это занимает слишком много времени во время выполнения. Вы профилировали его, чтобы проверить, что это этот код?   -  person kͩeͣmͮpͥ ͩ    schedule 25.11.2008
comment
Да, я профилировал, что проблема в этом коде. Это занимает слишком много времени во время выполнения, я имею в виду, что 40 раз вызов этого метода занимает в общей сложности 8 секунд.   -  person Ali Ersöz    schedule 25.11.2008
comment
40 звонков занимает 8 секунд? Мне трудно в это поверить, если только у вас нет специального преобразователя типов, на который уходит много времени. Пожалуйста, предоставьте краткий, но полный пример программы.   -  person Jon Skeet    schedule 25.11.2008


Ответы (1)


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

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 итераций. Трудно поверить, что на вашем компьютере требуется 8 секунд, чтобы выполнить 40 итераций.

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

person Jon Skeet    schedule 25.11.2008
comment
Вообще-то я видел прошедшее время на другой машине и может что-то пропустил. Когда я пытался, я не тратил так много времени. Я проверю код на этой машине и скоро вернусь к вам. - person Ali Ersöz; 26.11.2008