I have am creating an Instance dynamically using Activator.CreateInstance. However, it is saying object cannot be null on every attempt. Pasting the code below. Am I doing anything wrong?
Is there any problem if
Activator.CreateInstance
replaces the conventional switch/case statements for determining the object type in the run-time? Thanks.
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();
}
From the documentation of the typeName
parameter of Type.GetType
:
The assembly-qualified name of the type to get. See AssemblyQualifiedName. If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.
This means that you need to (at least) pass the namespace as well:
BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("YourNamespace.Derived"));
Well, Type.GetType("Derived")
is almost certainly returning null - which would make it nothing to do with Activator.CreateInstance
.
Check:
Derived
in the same assembly as the calling code? If not, use Assembly.GetType
on the right assembly, or include the assembly name in the type name you're passing to Type.GetType()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With