を使用して型のインスタンスを作成するのは簡単Activator.CreateInstance(Type)
です。
編集何らかの理由で、タイプ名を渡すことはできますが、渡すことはできません。これを指摘してくれたジョンに感謝します。
Type
ただし、型名からを取得する必要があります。タイプ名が常に完全修飾されている場合(少なくともアセンブリ名まで)、次を使用できます。
Type t = Type.GetType(typeName);
ただし、タイプが見つからない場合は例外がスローされます。あなたはより良いかもしれません:
Type t = Type.GetType(typeName, false);
その後:
object result = null;
if(t != null)
result = Activator.CreateInstance(t);
編集を終了
ただし、場合によっては、その型にデフォルトのコンストラクターがない場合があります。その場合は、それをスキップするか(から例外をキャッチするか、Activator.CreateInstance
最初にコンストラクターのリフレクション検索を実行する)、依存型を構築する方法を見つける必要があります。タイプも同様です(Activator.CreateInstance
パラメーターを持つコンストラクターもサポートします-@ Jonの回答にはリンクが含まれています)。
ここで提案するこの単純な(Type)
オーバーロードは、すべてオプションのパラメーターを持つコンストラクターを持つ型で機能するとは思わない。
public class MyClass {
public MyClass(string p1 = null, int p2 = 10, ...) { }
}
//...
var o = Activator.CreateInstance(typeof(MyClass)); //<-- will fail
これはデフォルトのコンストラクターではないため、すべてのデフォルト値を「拡張」バージョンの呼び出しに引き出すことにより、そのようなコンストラクターをデフォルトであるかのようにバインドするのはコンパイラーの責任です。