Reflection can be used in C# to invoke a class’ constructor. This is useful when you don’t know the type of the class that you want to instantiate until runtime.
As usual, there are various options open to you depending on your requirements.
Invoking the Default (Parameterless) Constructor
When You Can Pass the Required Type as a Generic Parameter
Under these circumstances, you don’t need to use reflection at all:
[code language=”C#”]
T Instantiate() where T : new()
{
return new T();
}
[/code]
Alternatively, you can call the generic version of Activator.CreateInstance
:
[code language=”C#”]
ObjectType instance = Activator.CreateInstance();
[/code]
When You Know the Required Type
You can instantiate using either the type itself:
[code language=”C#”]
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
[/code]
Or the type’s name:
[code language=”C#”]
ObjectType instance = (ObjectType)Activator.CreateInstance(“MyNamespace.ObjectType, MyAssembly”);
[/code]
When You Need a Reference to the Default Constructor
This is useful if you want to call the constructor later.
[code language=”C#”]
var constructor = type.GetConstructor(Type.EmptyTypes);
…
ObjectType instance = (ObjectType)constructor.Invoke(null);
[/code]
Invoking a Parameterized Constructor
If you want to get a reference to a constructor that has, for example, two parameters, the first of which is a long
and the second an int
:
[code language=”C#”]
// We need the constructor with the following signature:
var argTypes = new[]
{
typeof (long),
typeof (int)
};
ConstructorInfo constructor = ObjectType.GetConstructor(argTypes);
[/code]
This constructor can then be invoked like this:
[code language=”C#”]
var argValues = new object[] { lngFirstParameter, intSecondParameter };
ObjectType instance = (ObjectType) constructor .Invoke(argValues);
[/code]
Getting Information About Constructor Parameters
The following method will write out the parameters of type ObjectType
:
[code language=”C#”]
public void PrintParameters()
{
var ctors = typeof(ObjectType).GetConstructors();
// Assuming class ObjectType has only one constructor:
var ctor = ctors[0];
foreach (var param in ctor.GetParameters())
{
Console.WriteLine(string.Format(“Parameter {0} is named {1} and is of type {2}”,param.Position, param.Name, param.ParameterType));
}
}
[/code]
References
- (StackOverflow) Most efficient way to get default constructor of a Type
- (StackOverflow) Name of the constructor arguments in c#
- (MSDN) Activator.CreateInstance Method