如何从类型';的名称和程序集';的名字
本文关键字:程序集 类型 | 更新日期: 2023-09-27 18:15:23
我需要获得一个类型的实例,该类型的名称和程序集名称将在运行时提供。我事先知道该类型将有一个无参数构造函数。做这件事最简单的方法是什么?
这比我希望的要困难得多。
编辑:我不确定这是否相关,但程序集将被引用。我不需要从磁盘或其他地方加载它。
Type.GetType(string.Concat(typeName, ", ", assemblyName))
http://msdn.microsoft.com/en-us/library/w3f99sx1.aspxhttp://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx
来自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();
如果引用System.Web.dll对您来说不是问题,那么有一种鲜为人知的BuildManager.GetType方法非常有效。它甚至不需要程序集名称,因为它扫描当前AppDomain执行路径中程序集中的类型。
所以代码是:
object instance = Activator.CreateInstance(BuildManager.GetType("MyNamespace.MyClass", true));
以下内容就足够了:
var assmebly = Assembly.Load("FullyQualifiedAssemblyName");
var type = assmebly.GetType("FullTypeName");
var instance = Activator.CreateInstance(type);
Type referencedType = typeof(AReferencedType);
AReferencedType instance = Activator.CreateInstance<AReferencedType>();
or
Type type = Type.GetType("Type's full name");
object instance = Activator.CreateInstance(type);
Activator.CreateInstance(Type.GetType("System.Int32"));
激活剂
类型
以下是使用花哨的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
将文件名作为第一个参数,而不是类型说明符。这有时很有用,尤其是当您不关心程序集的强名称时。