Activator.CreateInstance(string) と Activator.CreateInstance<T>() の違い
-
09-06-2019 - |
質問
いいえ、これはジェネリック医薬品に関する質問ではありません。
内部コンストラクターを持ついくつかのクラスを含むファクトリ パターンがあります (ファクトリを介さない場合はインスタンス化されたくないです)。
私の問題はそれです 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 にはデフォルトのコンストラクターが必要です
所属していません StackOverflow