我正在使用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();
}
答案 0 :(得分:3)
来自Type.GetType
的typeName
参数的文档:
要获取的类型的程序集限定名称。看到 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
。你必须: