自分が持っているジェネリックメソッドで指定した型のインスタンスを作成したいと思います。このタイプには、オーバーロードされたコンストラクターがいくつかあります。コンストラクターに引数を渡せるようにしたいのですが、
Activator.CreateInstance<T>()
オプションとしてこれを持っているとは思わない。
それを行う別の方法はありますか?
自分が持っているジェネリックメソッドで指定した型のインスタンスを作成したいと思います。このタイプには、オーバーロードされたコンストラクターがいくつかあります。コンストラクターに引数を渡せるようにしたいのですが、
Activator.CreateInstance<T>()
オプションとしてこれを持っているとは思わない。
それを行う別の方法はありますか?
(T)Activator.CreateInstance(typeof(T), param1, param2);
名前付きパラメーターを介してCreateInstanceに引数を渡す別の方法があります。
これに基づいて、配列をに渡すことができますCreateInstance
。これにより、0個または複数の引数を持つことができます。
public T CreateInstance<T>(params object[] paramArray)
{
return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
ただし、Activator.CreateInstanceで引数を渡すと、パラメーターなしの作成と比べてパフォーマンスに大きな違いがあることに注意してください。
プリコンパイルされたラムダを使用してオブジェクトを動的に作成するためのより良い代替手段があります。もちろん、パフォーマンスは常に主観的なものであり、それが価値があるかどうかは、それぞれの場合に明らかに依存します。
グラフは記事から取得され、1000回の呼び出しあたりのミリ秒単位で表されます。
Activator.CreateInstanceの代わりに、リンクされたURLのFastObjectFactoryは、Activatorよりも優れたプリフォームを実行します(.NET 4.0以降、.NET3.5よりも大幅に優れています。.NET4.5ではテスト/統計は行われません)。統計、情報、コードについては、StackOverflowの投稿をご覧ください。
public class AssemblyLoader<T> where T:class
{
public void(){
var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll")
}
public T Load(string assemblyFile, string objectToInstantiate)
{
var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();
return loaded as T;
}
}