我正在编写一些代码来动态创建一些对象(未知类型),我很好奇为什么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实例?
答案 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);