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?
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
nullarray-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: