実行時に名前とアセンブリ名を持つ型のインスタンスを取得する必要があります。私は事前に型がパラメータのないコンストラクタを持つことを知っています。これを行う最も簡単な方法は何ですか?型の名前とアセンブリの名前から型をロードする方法
私はそれが望んでいたよりもずっと難しいです。
編集:これは関連しているが、アセンブリが参照されているとは限りません。私はディスクなどからロードする必要はありません。
実行時に名前とアセンブリ名を持つ型のインスタンスを取得する必要があります。私は事前に型がパラメータのないコンストラクタを持つことを知っています。これを行う最も簡単な方法は何ですか?型の名前とアセンブリの名前から型をロードする方法
私はそれが望んでいたよりもずっと難しいです。
編集:これは関連しているが、アセンブリが参照されているとは限りません。私はディスクなどからロードする必要はありません。
Type.GetType(string.Concat(typeName, ", ", assemblyName))
http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx
以下で十分です:
var assmebly = Assembly.Load("FullyQualifiedAssemblyName");
var type = assmebly.GetType("FullTypeName");
var instance = Activator.CreateInstance(type);
MSDNから:
Activator.CreateInstanceメソッド(String、String)を
名前指定されたタイプのインスタンスを作成し名前付きアセンブリと既定のコンストラクターを使用します。
public static ObjectHandle CreateInstance( string assemblyName, string typeName )
例:
var assemblyName =
"System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
var typeName = "System.Net.WebClient";
var instance = Activator.CreateInstance(assemblyName, typeName).Unwrap();
Type referencedType = typeof(AReferencedType);
AReferencedType instance = Activator.CreateInstance<AReferencedType>();
or
Type type = Type.GetType("Type's full name");
object instance = Activator.CreateInstance(type);
のSystem.Web.dllを参照することはあなたのための問題ではない場合があり、 lそれは非常に効率的であると知られているBuildManager.GetType Methodです。現在のAppDomain実行パス内のアセンブリの型をスキャンするため、アセンブリ名は必要ありません。
ので、コードは次のようになります。
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
実際にはほとんど知られていません。先端に感謝します。 – David
非常に便利で便利です。 core> _ < – user2864740
ここで空想dynamic
キーワードを使用して動作します何か。テストをパスするには、他のクラスを参照するか、ビルドされたDLLをコピーするためにビルドイベントを使用する必要があります。 Activator
異なり
namespace TestLibrary
{
[TestFixture]
public class Tests
{
[Test]
public void FileCheck()
{
dynamic otherClass =
AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap("OtherLibrary.dll",
"Prefix.OtherLibrary.SomeClass");
otherClass.SayHello(); // look, ma! no casting or interfaces!
}
}
}
namespace Prefix.OtherLibrary
{
public class SomeClass
{
public void SayHello()
{
Console.WriteLine("Hello, world.");
}
}
}
、AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap
は、最初の引数ではなく、型指定子として名をとります。これは、特にアセンブリの厳密な名前を気にしないときに便利なことがあります。
興味深いアプローチ。私はあなたを知っていますか? – David
これは私がこれをマークしているいくつか働いているメソッドです。ありがとう。 – David