Вопрос

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

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

Редактировать:Чтобы прояснить...

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

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

Это было полезно?

Решение

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

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 секунд.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top