2011-11-21 107 views
6

我需要获取一个类型的实例,该类型的名称和程序集名称在运行时会有。我事先知道类型将有一个无参数的构造函数。最简单的方法是什么?如何从类型名称和程序集名称中加载一个类型

这是waaaaaaay比我希望它会更难。

编辑:我不是如果这是相关的,但程序集将被引用。我不需要从磁盘或其他东西加载它。

回答

2

以下应该足够:

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

MSDN

Activator.CreateInstance方法(字符串,字符串)

创建其名称被指定的类型的实例,使用命名的程序集和默认构造函数。

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

在第二个片段中,GetType是否也需要程序集的名称?我认为它的确如此。 – David

+0

@David,如果您使用完全限定类型名称,则不需要http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx –

+0

那么,那种需要程序集的名称。无论如何,这都很好。 – David

3

如果引用System.Web.dll的是不是你的问题,还有就是升ittle-已知的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。

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."); 
     } 
    } 
} 

不同于ActivatorAppDomain.CurrentDomain.CreateInstanceFromAndUnwrap需要文件名作为第一个参数,而不是一个类型说明符。这有时是有用的,特别是当你不关心程序集的强名时。

+0

有趣的方法。我认识你吗? – David

相关问题