为什么Assembly和Activator对CreateInstance的行为有所不同

时间:2013-10-08 18:28:32

标签: c# reflection

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

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实例?

2 个答案:

答案 0 :(得分:6)

Assembly.CreateInstance在该程序集中创建一个类型的实例。

System.Int32未在程序集中定义。

要完成这项工作,您需要获取mscorlib的Assembly 例如,您可以编写typeof(Assembly).Assembly

答案 1 :(得分:0)

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);