プログラムで.NETタイプ文字列を使用するにはどうすればよいですか?
-
01-10-2019 - |
質問
たとえば、.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
.