2011-11-21 11 views
6

実行時に名前とアセンブリ名を持つ型のインスタンスを取得する必要があります。私は事前に型がパラメータのないコンストラクタを持つことを知っています。これを行う最も簡単な方法は何ですか?型の名前とアセンブリの名前から型をロードする方法

私はそれが望んでいたよりもずっと難しいです。

編集:これは関連しているが、アセンブリが参照されているとは限りません。私はディスクなどからロードする必要はありません。

答えて

2

以下で十分です:

var assmebly = Assembly.Load("FullyQualifiedAssemblyName"); 
var type = assmebly.GetType("FullTypeName"); 
var instance = Activator.CreateInstance(type); 
5

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(); 
+0

私はそれを試して問題を抱えていたので、私の質問です。 – David

+0

@David:何が問題でしたか?私は実際の例を追加しました。それは役に立ちますか? – dtb

+1

アセンブリのVersion、Culture、PublicKeyTokenを指定していないので、動作しなかった可能性があります。しかし、例はそうではないようです。 – David

2
Type referencedType = typeof(AReferencedType); 
AReferencedType instance = Activator.CreateInstance<AReferencedType>(); 

or 

Type type = Type.GetType("Type's full name"); 
object instance = Activator.CreateInstance(type); 
+0

2番目のスニペットでは、GetTypeはアセンブリの名前も必要としませんか?私はそう思った。 – David

+0

@David、完全修飾型の名前を使用しない場合http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx –

+0

そのような種類のアセンブリの名前が必要です。とにかく、それはすべて良いです。 – David

3

のSystem.Web.dllを参照することはあなたのための問題ではない場合があり、 lそれは非常に効率的であると知られているBuildManager.GetType Methodです。現在のAppDomain実行パス内のアセンブリの型をスキャンするため、アセンブリ名は必要ありません。

ので、コードは次のようになります。

object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true)); 
+0

実際にはほとんど知られていません。先端に感謝します。 – David

+0

非常に便利で便利です。 core> _ < – user2864740

2
Activator.CreateInstance(Type.GetType("System.Int32")); 

Activator

Type

+0

私は実行時にアセンブリとクラスの名前しか持っていません。 – David

1

ここで空想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は、最初の引数ではなく、型指定子としてをとります。これは、特にアセンブリの厳密な名前を気にしないときに便利なことがあります。

+0

興味深いアプローチ。私はあなたを知っていますか? – David

関連する問題