如何从类型名称和程序集名称中加载一个类型
我需要获取一个类型的实例,该类型的名称和程序集名称在运行时会有。我事先知道类型将有一个无参数的构造函数。最简单的方法是什么?如何从类型名称和程序集名称中加载一个类型
这是waaaaaaay比我希望它会更难。
编辑:我不是如果这是相关的,但程序集将被引用。我不需要从磁盘或其他东西加载它。
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方法(字符串,字符串)
创建其名称被指定的类型的实例,使用命名的程序集和默认构造函数。
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的是不是你的问题,还有就是升ittle-已知的BuildManager.GetType Method,这是非常有效的。它甚至不需要程序集名称,因为它扫描当前AppDomain执行路径中程序集中的类型。
因此,代码是:
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
确实鲜为人知。谢谢你的提示。 – David
非常有用和方便。如果core> _ user2864740
这里的东西用花哨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.");
}
}
}
不同于Activator
,AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap
需要文件名作为第一个参数,而不是一个类型说明符。这有时是有用的,特别是当你不关心程序集的强名时。
有趣的方法。我认识你吗? – David
这是我工作的一些方法,我正在标记这一个。谢谢。 – David