如何从类型';的名称和程序集';的名字

本文关键字:程序集 类型 | 更新日期: 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文件名作为第一个参数,而不是类型说明符。这有时很有用,尤其是当您不关心程序集的强名称时。