質問

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

内部コンストラクターを持ついくつかのクラスを含むファクトリ パターンがあります (ファクトリを介さない場合はインスタンス化されたくないです)。

私の問題はそれです 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」パラメーターを渡す方法を見つけることができませんでした。

何かを見逃したのでしょうか、それとも不可能ですか?

役に立ちましたか?

解決

これを回避するには、次のように使用方法を変更するだけではだめでしょうか。

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

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

他のヒント

コンストラクターをプライベートにすることが絶対に必要な場合は、次のようなことを試すことができます。

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), true) が機能することに加えて、T にはデフォルトのコンストラクターが必要です

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top