0

重複の可能性:
Activator.CreateInstance-パラメーター化されたコンストラクターを持つクラスのインスタンスを作成する方法

デフォルトのコンストラクターを使用せずに、実行時に決定されるタイプのオブジェクトを作成する方法を考えていました。

つまり、私にはBaseClassさまざまな子クラスがあります。

Type type; //this variable will be one of the child classes
BaseClass base = Activator.CreateInstance(type);

これにより、デフォルトのコンストラクターを使用して子クラスオブジェクトを作成できますが、特定のコンストラクターを呼び出したいと思います。すべての子クラスに特定のパラメーターを受け取るコンストラクターがあることを知っているので、そのコンストラクターが存在しないという心配はありません。私はこの質問を見つけましたが、私が得ることができる最良のものは単一の文字列パラメーターです。これは実行可能ですか?

4

2 に答える 2

3

3つのオプション:

3番目のオプションでは、もちろん、新しいタイプを追加するたびにファクトリコードを変更する必要がありますが、これは1行だけです。

Activator.CreateInstance個人的には、最初のオプションが好きです。これは、(実行時に最適なコンストラクターを見つけることに依存するのではなく)最も制御できるためです。これがパフォーマンスに敏感なコードである場合は、実行時にデリゲートを検出することで、デリゲートの辞書を作成できます。コンストラクター、次に式ツリーを使用します。(私が知る限り、コンストラクターからデリゲートを作成することはできませんDelegate.CreateDelegate。これはやや面倒です。)

于 2013-01-02T19:11:03.917 に答える
2

これを行うには、オーバーロードを使用できますActivator.CreateInstance(Type, Object[])。提供されたパラメーターに基づいて、最も適切なコンストラクターを呼び出します。

例えば:

public class Test{
 public Test(){
    Console.WriteLine("Defaul ctor");
 }

 public Test(int i){
    Console.WriteLine("Test(int)");
 }

 public  Test(int i, string s){
    Console.WriteLine("Test(int, string)");
 }
}

public static void Main()
{
    var o1 = Activator.CreateInstance(typeof(Test));
    var o2 = Activator.CreateInstance(typeof(Test), 1);
    var o3 = Activator.CreateInstance(typeof(Test), 1, "test");
}
于 2013-01-02T19:08:30.590 に答える