To instantiate an inner class, you must first instantiate the outer class. Then, create the inner object within the outer object with this syntax: OuterClass outerObject = new OuterClass(); OuterClass. InnerClass innerObject = outerObject.
We can use newInstance() method on the constructor object to instantiate a new instance of the class. Since we use reflection when we don't have the classes information at compile time, we can assign it to Object and then further use reflection to access it's fields and invoke it's methods.
Instance constructorInstance constructors can have public, private, protected, external, or internal modifiers.
Constructor code or any internal method used only by constructor are not included in final code. A constructor can be either public or internal.
The issue is that Activator.CreateInstance(Type, object[])
does not consider non-public constructors.
Exceptions
MissingMethodException: No matching public constructor was found.
This is easily shown by changing the constructor to public
visibility; the code then works correctly.
Here's one workaround (tested):
BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
CultureInfo culture = null; // use InvariantCulture or other if you prefer
object instantiatedType =
Activator.CreateInstance(typeToInstantiate, flags, null, parameter, culture);
If you only require the parameterless constructor this will work as well:
//using the overload: public static object CreateInstance(Type type, bool nonPublic)
object instantiatedType = Activator.CreateInstance(typeToInstantiate, true)
(tested successfully)
object instantiatedType =
Activator.CreateInstance(typeToInstantiate,
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance,
null, new object[] {parameter}, null);
There are two issues this addresses:
new object[] {parameter}
helps it handle the issue of passing an object[]
as a single parameter of method that takes a params object[]
argumentBindingFlags
helps resolve the non-public constructor(the two null
s relate to the binder; the default binder behaviour is fine for what we want)
You need to call a different overload of Activator.CreateInstance
that lets you pass a nonPublic
or BindingFlags
parameter.
I find all these CreateInstance
overloads clumsy; what I prefer to do is:
typeToInstantiate.GetConstructor()
, passing BindingFlags.NonPublic
ConstructorInfo.Invoke
, passing it the constructor parameterchange it to
Activator.CreateInstance(typeToInstantiate,new object[] { parameter });
This is because your constructor also expects an object array and activator already splits it up into separate objects
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