プログラムで.NETタイプ文字列を使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3661690

質問

たとえば、.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.
}
役に立ちましたか?

解決

あなたは電話することができます Type.GetType 方法 取得するには Type 与えられた(アセンブリ認定)名前のオブジェクト。

あなたは電話することができます Activator.CreateInstance 方法 タイプのインスタンスを作成します。 (このタイプには公開デフォルトコンストラクターがあると仮定するか、コンストラクターの引数がどのようなものかを知っていると仮定)。

例えば:

Activator.CreateInstance(Type.GetType(name));

他のヒント

これらのセクションは通常、Visual Studio Settings Designerで作成/アクセスされます。

ソリューションでは、プロパティ - > settings.settingsまたはviaによるプロジェクトの下を探索します。

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

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

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

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