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


236

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

Activator.CreateInstance<T>()

これはオプションとして表示されません。

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


回答:



16

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

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

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

2
これは不完全に見えますが、確かにvoidではなくT型のオブジェクトを返す必要がありますか?public T CreateInstance <T>(params object [] paramArray){return(T)Activator.CreateInstance(typeof(T)、args:paramArray); }
2017年

11

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

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

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

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

性能比較


(平均的に、同じハードウェア上)でパラメータコンストラクタの各呼び出しはそのコンテキストの、このチャートは手段Activator.CreateInstanceになります0.0035ms、あなたのアプリケーションに応じて、これはさえ、すべてのパフォーマンス・テストで登録しないかもしれません- (または3.5マイクロ秒)。

6

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

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


パラメータを渡すときにActivator.CreateInstanceよりもパフォーマンスが高い可能性が高い代替ソリューション(リンクされている)があることを意味しますか?それとも、すべてのケースでパフォーマンスが向上する可能性がありますか?
El Zorko 2014年

1
私はしばらくパフォーマンステストを行っていませんが、誰かが.NET 4.0の統計を投稿したようですが、.NET 4.0ではFastObjectFactoryの方がパフォーマンスが優れているようです。Activator.CreateInstanceは.NET 3.5ではひどいもので、.NET 4.0では大幅に高速でしたが、そのURLでリンクされているFastObjectFactoryよりも低速でした。
テムズ、2014年

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

1
これは説明されていないコードのみです。私はそれが役立つか、あるいはまったく機能しないことを疑っています。そうでないと私を納得させるために、これがどのように機能するか、なぜそれが問題を解決することになっているのかを説明してください。
ユンノシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.