1

たとえば、.NET app.config では、次のようになります。

<configuration>
   <configSections>
      <section name="MyConfig" type="MyAssembly.MyType, MyAssembly, PublicKeyToken=null" />
   </configSections>
   ...
</configuration>

型部分の署名は、さまざまな .NET の場所で標準化されているようですが、自分のプログラム内でこれを行う方法がわかりません。私は自分のプログラムで使用System.Activatorしましたが、.NET が既に行っている作業を複製しているように感じます。

プログラミング用語では、これを行う方法は次のとおりです。

void Main()
{
   object instance = CreateInstance("MyAssembly.MyType, MyAssembly, PublicKeyToken=null");
   Console.WriteLine(instance.GetType().Name);
}

object CreateInstance(string dotNetTypeSignature)
{
   // Code goes here.
}
4

3 に答える 3

4

Type.GetTypeメソッドを呼び出してType、指定された (アセンブリ修飾された) 名前のオブジェクトを取得できます。

Activator.CreateInstanceメソッドを呼び出して、型のインスタンスを作成できます。(型にパブリックの既定のコンストラクターがあるか、その型が受け取るコンストラクター引数を知っていると仮定します)。

例えば:

Activator.CreateInstance(Type.GetType(name));
于 2010-09-07T18:53:53.527 に答える
0

完全な型名は通常、特定の型への「遅延」バインディングを行うために使用されます。あなたが持っている構成ファイルの例では、実際の構成セクションのタイプはCLRビルド時に不明だったため、ConfigurationManager構成ファイルから実際のタイプを読み取り、実行時にそれをインスタンス化する必要があります。あなたが言及したように、これはクラスを使用して行われSystem.Activator、.Netの世界でそれを行う標準的な方法です。

もちろん、インスタンスを作成する型がビルド時にわかっている場合は、それを含むアセンブリを参照してnew. ただし、 のような実行時の拡張性を実装したい場合は、またはメソッドConfigurationManagerを使用する必要があります。これらのメソッドには、使用する構成から読み取った正確な文字列を渡すことができるオーバーライドがあるか、または のインスタンスも作成できます。同じ弦から。Activator CreateInstanceCreateInstanceFromType

そしてもちろん、拡張ポイントの実装で完全な型名を書き出す必要がある別の側面もあります。これを行うにはtypeof(MyType).FullName、 またはを使用できますmyInstance.GetType().FullName

于 2010-09-07T19:02:34.957 に答える
0

これらのセクションは通常、ビジュアル スタジオ設定デザイナーで作成/アクセスされます。

ソリューション エクスプローラーで [Properties] -> [Settings.settings] の下を確認するか、プロジェクト名を右クリックして [Properties] -> [Settings] を選択します。

于 2010-09-07T18:56:38.433 に答える