11

いいえ、これはジェネリックに関する質問ではありません。

内部コンストラクターを持ついくつかのクラスを持つファクトリーパターンがあります(ファクトリーを介していない場合、それらをインスタンス化したくありません)。

私の問題は、CreateInstance非公開パラメーターに「true」を渡さない限り、「このオブジェクトにパラメーターなしのコンストラクターが定義されていません」というエラーで失敗することです。

// Fails
Activator.CreateInstance(type);

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

次のように、ファクトリをジェネリックにしてもう少しシンプルにしたかったのです。

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

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

私は何かを見逃しましたか、それとも不可能ですか?

4

3 に答える 3

21

これを回避するには、次のように使用法を変更するだけではいけません:

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

ファクトリ メソッドはジェネリックのままですが、アクティベーターの呼び出しではジェネリック オーバーロードは使用されません。しかし、それでも同じ結果が得られるはずです。

于 2008-09-11T19:48:43.373 に答える
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 をゼロから作成するのではなく、すべてのファクトリの基本クラスとして使用しようとしていますか?

于 2008-09-11T19:53:40.443 に答える
0

Activator.CreateInstance(typeof(T), true) が機能する以外に、T にはデフォルトのコンストラクターが必要です

于 2010-06-13T12:54:58.813 に答える