Activator.CreateInstance失败

时间:2012-01-23 09:14:04

标签: c#

我正在使用Activator.CreateInstance动态创建一个实例。但是,它表示对象不能在每次尝试时都为空。粘贴下面的代码。我做错了吗?

如果

有问题吗?
  

Activator.CreateInstance

替换传统的switch / case语句来确定运行时的对象类型?感谢。

public abstract  class Base
{
    public abstract void Func();

}
public  class  Derived:Base
{
    public override void Func()
    {
        MessageBox.Show("Derived First");
    }
}

public class Derived2 : Base
{
    public override void Func()
    {
        MessageBox.Show("Derived Second");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    // I was trying to make use of the overladed version 
    // where it takes the Type as parameter.
    BaseClass report = 
       (BaseClass) Activator.CreateInstance(Type.GetType("Derived")); 
    report.Func();
}

5 个答案:

答案 0 :(得分:3)

来自Type.GetTypetypeName参数的文档:

  

要获取的类型的程序集限定名称。看到   AssemblyQualifiedName。如果类型在当前正在执行   汇编或在Mscorlib.dll中,提供类型名称就足够了   由其命名空间限定。

这意味着您还需要(至少)传递命名空间:

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("YourNamespace.Derived")); 

答案 1 :(得分:3)

好吧,Type.GetType("Derived")几乎肯定会返回null - 这会使它与Activator.CreateInstance无关。

检查:

  • Derived与调用代码在同一个程序集中吗?如果没有,请在右侧程序集上使用Assembly.GetType,或在您传递给Type.GetType()的类型名称中包含程序集名称
  • 您的类型是否在命名空间中?如果是这样,您需要命名空间 - 限定它

答案 2 :(得分:3)

Type.GetType("Derived"找不到类型

简单的改变

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("Derived"));

到这个

Base report = (Base)Activator.CreateInstance(typeof(Derived));

答案 3 :(得分:1)

GetType方法失败并返回null。请参阅上一个链接的参数部分。

  

要获取的类型的程序集限定名称。请参阅AssemblyQualifiedName。如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

"Derived"之前添加命名空间,如果Derived类在不同的程序集中,则在末尾添加", assemblyname"


请注意,如果您不想更改传入GetType的字符串,那么您可以使用typeof(Derived)(尽管在这种情况下使用{{1}没有多大意义})。

答案 4 :(得分:0)

在运行时,您的GetType调用将返回null。你必须:

  • 确定您的命名空间
  • 或使用typeof