Given the following sample code;
class Program
{
static void Main(string[] args)
{
var results = GetChildren().ToList();
}
static IEnumerable<MyBaseClass> GetChildren()
{
return Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.BaseType == typeof(MyBaseClass))
.Select(o => (MyBaseClass)Activator.CreateInstance(o, null));
}
}
abstract class MyBaseClass
{ }
class MyChildClass : MyBaseClass
{
public MyChildClass(object paramOne)
{
}
}
I'm receiving the following error;
MissingMethodException: Constructor on type 'CreateInstanceCtorIssue.MyChildClass' not found.
However, if I add a parameterless constructor, it creates the objects OK.
I'm trying to work out why the parameter I'm suppying to CreateInstance is not causing it to find the correct constructor. Anyone got any ideas?
The Activator. CreateInstance method creates an instance of a type defined in an assembly by invoking the constructor that best matches the specified arguments. If no arguments are specified then the constructor that takes no parameters, that is, the default constructor, is invoked.
Creates an instance of the specified type using the constructor that best matches the specified parameters. CreateInstance(Type, Object[], Object[]) Creates an instance of the specified type using the constructor that best matches the specified parameters.
Basically, the second argument of the method you are calling is a params array. What's happening is that the C# compiler is treating your method-call as though you are passing this argument in using the "unexpanded" form, i.e. by passing a null
array-reference. On the other hand, your intent is to use the "expanded" form, i.e. pass a reference to an array containing a single null-reference.
You can coax the compiler to do what you want like this:
// Unexpanded:
Activator.CreateInstance(o, new object[] { null })
// Expanded explictly:
Activator.CreateInstance(o, (object) null )
You have to pass the constructor parameters:
.Select(o => (MyBaseClass)Activator.CreateInstance(o, new object[] { someParam }));
MyChildClass
expects a single parameter of type object for its constructor - you have to pass this parameter within an array.
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