265

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

Activator.CreateInstance<T>()

オプションとしてこれを持っているとは思わない。

それを行う別の方法はありますか?

4

5 に答える 5

523

はい。

(T)Activator.CreateInstance(typeof(T), param1, param2);
于 2010-03-16T00:08:48.760 に答える
24

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

これに基づいて、配列をに渡すことができますCreateInstance。これにより、0個または複数の引数を持つことができます。

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
于 2016-09-22T04:06:17.897 に答える
17

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

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

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

グラフは記事から取得され、1000回の呼び出しあたりのミリ秒単位で表されます。

パフォーマンスの比較

于 2018-08-07T08:32:06.177 に答える
6

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

Activator.CreateInstanceでctorargsを渡す方法、またはILを使用する方法は?

于 2010-06-17T03:19:49.707 に答える
0
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;
    }
}
于 2020-04-03T20:13:30.217 に答える