2

我正在编写一些代码来动态创建一些对象(未知类型),我很好奇为什么 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 的实例时,为什么这两个行为会有所不同?

4

2 回答 2

6

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

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

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

于 2013-10-08T18:30:31.787 回答
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);
于 2013-10-08T18:44:55.157 回答