web-dev-qa-db-ja.com

Activator.CreateInstance <T>()にパラメーターを渡す方法

私が持っているジェネリックメソッドで指定する型のインスタンスを作成したい。この型には、オーバーロードされたコンストラクタがいくつかあります。私はコンストラクタに引数を渡すことができるようにしたいが、

Activator.CreateInstance<T>()

これをオプションとしては見ていません。

別の方法がありますか?

203
DaveDev

はい

(T)Activator.CreateInstance(typeof(T), param1, param2);
388
SLaks

名前付きパラメーターを介して引数をCreateInstanceに渡す別の方法があります。

それに基づいて、配列をCreateInstanceに渡すことができます。これにより、0個以上の引数を使用できます。

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
13
sudhAnsu63

Activator.CreateInstanceの代替として、リンクされたURLのFastObjectFactoryはActivatorよりも優れています(.NET 4.0以降、.NET 3.5よりも大幅に優れています。NET4.5でテスト/統計は行われません)。統計、情報、コードについてはStackOverflowの投稿をご覧ください:

Activator.CreateInstanceでctor引数を渡す方法、またはILを使用する方法

6
thames

ただし、Activator.CreateInstanceで引数を渡すと、パラメーターなしの作成と比べてパフォーマンスが大幅に異なることに注意してください。

事前にコンパイルされたラムダを使用してオブジェクトを動的に作成するためのより良い代替手段があります。もちろん、パフォーマンスは常に主観的であり、それが価値があるかどうかは明らかに各ケースに依存します。

この記事の問題に関する詳細

グラフは記事から取られており、1000コールあたりのミリ秒単位での所要時間を表しています。

Performance comparison

4