4

オブジェクトとキャストするオブジェクトの型を取得する型変換の汎用メソッドを作成しようとしています。

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にキャストしたい10進数として入力した列があります。このメソッドを呼び出すと、decimal を long にキャストするのに非常に時間がかかります。

また、このメソッドの T 型は値型のみである可能性があります。つまり、「T : 構造体」

4

1 に答える 1

3

私はまだあなたのパフォーマンスの主張を疑っています. これが証拠です。以下のプログラムをコンパイルして実行します (リリース モード)。

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

私のラップトップでは、100,000,000 回の反復を実行するのに 20 秒かかります。コンピューターで 40 回の反復を実行するのに 8 秒かかるとは信じがたいことです。

言い換えれば、問題はあなたが思っているところにはないのではないかと私は強く思っています。

于 2008-11-25T20:17:17.460 に答える