2

web.configファイルには、次のパターンに従った多くの文字列があります。

    type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, 
System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, 
PublicKeyToken=31BF3856AD364E35"

この情報をweb.config(文字列として読み取る方法を知っています)から読み取り、この文字列から型をインスタンス化したいです。

これを行う方法はありますか?

アップデート

私はただできると思います

Activator.CreateInstance(System.GetType(stringTypeName))

確認してください?

4

2 に答える 2

4

これを可能にするいくつかのオーバーロードがありActivator.CreateInstanceます。ただし、文字列をタイプ名とアセンブリ名に手動で分割する必要があります。

更新:これに対するあなた自身の見解も正しいです(方法はですがType.GetType())。

于 2012-12-12T14:47:46.897 に答える
0

を使用して型のインスタンスを作成するのは簡単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

これはデフォルトのコンストラクターではないため、すべてのデフォルト値を「拡張」バージョンの呼び出しに引き出すことにより、そのようなコンストラクターをデフォルトであるかのようにバインドするのはコンパイラーの責任です。

于 2012-12-12T14:48:42.810 に答える