質問

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

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

このメソッドのT型は、値型のみになります。 &quot; T:struct&quot;という意味です

役に立ちましたか?

解決

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

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