为什么程序集和激活器对于 CreateInstance 的行为不同

本文关键字:CreateInstance 程序集 激活 为什么 | 更新日期: 2023-09-27 18:34:39

我正在编写一些代码来动态创建一些对象(未知类型(,我很好奇为什么 Activator 能够生成类型,而程序集不能。下面是一个代码示例:

class Program
{
    static void Main(string[] args)
    {
        Type t = typeof (int);
        object notAnInt = Assembly.GetExecutingAssembly().CreateInstance(t.FullName);//does not work
        object actualInt = Activator.CreateInstance(t);//works
        Console.WriteLine(notAnInt);
        Console.WriteLine(actualInt);
    }
}

我的问题是,为什么这两个人的行为不同,而我认为它们都应该能够创建一个 int 的实例?

为什么程序集和激活器对于 CreateInstance 的行为不同

Assembly.CreateInstance

该程序集中创建某个类型的实例。

程序集中未定义System.Int32

要做到这一点,你需要获得 mscorlib 的Assembly
例如,您可以编写typeof(Assembly).Assembly

Assembly.GetExecutingAssembly(( 获取您的 exe 或 dll(当前实际正在执行的程序集(。由于 Int32 是在 mscorlib 中定义的,而不是在 exe 或 dll 中定义的,因此 Assembly.GetExecutingAssembly((。CreateInstance(( 将返回 null。要使用 CreateInstance 获取 int 类型对象,请尝试以下代码:

var intTypeAssembly = Assembly.GetAssembly(t);
object iAmAnInt = intTypeAssembly.CreateInstance(t.FullName);