2008-09-11 10 views
11

いいえ、これはジェネリックスに関する質問ではありません。Activator.CreateInstance(文字列)とActivator.CreateInstance <T>()の違い

私は、内部コンストラクタを持ついくつかのクラスを持つFactoryパターンを持っています(私は工場ではなくインスタンス化されたくありません)。

私の問題は、非公開のパラメータに "true"を渡さない限り、CreateInstanceが "このオブジェクトに対して定義されたパラメータなしコンストラクタなし"エラーで失敗するということです。私はこのようなことが少し簡単にするために、一般的な工場、作りたかった

// Fails 
Activator.CreateInstance(type); 

// Works 
Activator.CreateInstance(type, true); 

例:しかし

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance<T>(); 
    } 
} 

は、私は「真」渡す方法を見つけることができませんでした非公開のコンストラクタ(内部)を受け入れるためのパラメータ。

私は何かが恋しくなったのですか、それともできませんでしたか?この問題を回避するには

+2

はなぜtrueに設定プライベートブール変数とパラメータなしのコンストラクタを定義していないでしょうか? – Vivek

答えて

20

は、あなただけのようなあなたの使用状況を変えるのcouldnt:

public class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return Activator.CreateInstance(typeof(T), true); 
    } 
} 

あなたのファクトリメソッドは、まだジェネリックになりますが、アクティベータへの呼び出しは、一般的なオーバーロードを使用しません。しかし、あなたは同じ結果を達成する必要があります。

+0

素晴らしい解決策ですが、可能かどうかを知りたい場合は – juan

+0

オーバーロードが存在しない場合は、いいえと言わなければなりません。 – Kilhoffer

3

あなたは絶対にコンストラクタがプライベートであることを必要とした場合は、このような何か試すことができます。そうしないとあなたが新しい制約を追加し、そのルートを行くオフ最高だ

public abstract class GenericFactory<T> where T : MyAbstractType 
{ 
    public static T GetInstance() 
    { 
     return (T)Activator.CreateInstance(typeof(T), true); 
    } 
} 

を:

public abstract class GenericFactory<T> where T : MyAbstractType, new() 
{ 
    public static T GetInstance() 
    { 
     return new T; 
    } 
} 

あなたはGenericFactoryを最初から作成するのではなく、すべてのファクトリの基本クラスとして使用しようとしていますか?仕事をするActivator.CreateInstance(typeof演算(T)、真)以外

+0

最初のオプションはKilhofferのものと同じ 2つ目は動作しません。新しい()をwhereに追加すると、型にパブリックパラメータが必要です。これはまさに私が望まないものです – juan

+0

ええ、彼の投稿私が私のタイプを入力しているように見えた。 – rpetrich

0

、Tはデフォルトコンストラクタ

関連する問題