This blog post is archived. I consider it outdated and not very useful anymore but since there are many who still visit these pages I've decided to keep them up.
Dear Objects - How do I construct thee? Let me count the ways.
Typical construction
The standard way to create a new instance of an object is to use the new keyword.
var instance = new CoolObject();
var instance = new CoolObject(someParameter);
This is great when you know the object you’re constructing.
Reflection
You can also use reflection to create a new instance of an object. This is a little more involved.
//Here's a sample constructor
public CoolObject() { }
Type[] arrayOfTypeParameters = null;
var constructorInfo = typeof(CoolObject).GetConstructor(BindingFlags.Instance, null, arrayOfTypeParameters, null);
If we want a specific constructor with parameters we can make a call like the following
public CoolObject(bool isCool) { }
Type[] arrayOfTypeParameters = new [] { typeof(bool) };
var constructorInfo = typeof(CoolObject).GetConstructor(BindingFlags.Instance, null, arrayOfTypeParameters, null);
With the constructorInfo we can now invoke the constructor to return our object.
var instance = (CoolObject)constructorInfo.Invoke(null);
Or with a parameter
var instance = (CoolObject)constructorInfo.Invoke(new [] { false });
With this method we can invoke private, protected and public constructors.
Activator.CreateInstance/Assembly.CreateInstance
These are both technically shortcuts to the Reflection method above. Assembly.CreateInstance calls Activator.CreateInstance which calls ConstructorInfo.Invoke. You can, however, use a string for the type you wish to construct.
var instance = (CoolObject)Activator.CreateInstance("MyAwesomeProgram.CoolObject");
var instance = (CoolObject)Assembly.GetExecutingAssembly().CreateInstance("MyAwesomeProgram.CoolObject");
One caveat with the Assembly method is you must know which assembly contains the type you wish to instantiate. You can do a couple things here.
//this retrieves the assembly that contains your type
var assembly = Assembly.LoadFile(@"c:\my.dll");
var type = assembly.GetType("MyAwesomeProgram.CoolObject");
var instance = Activator.CreateInstance(type);
//or
var instance = assembly.CreateInstance("MyAwesomeProject.CoolObject");
You can also pass type info directly or even use generics.
var instance = Activator.CreateInstance(typeof(CoolObject));
var instance = Activator.CreateInstance<CoolObject>();
The latter call is especially useful when dealing with generics.
new T()
Sometimes all you have is a generic T and you want to create a new instance of T that has a default constructor. We need to declare that T can be constructed. We can do this with the new() constraint on T.
public CoolObject() { }
public T MakeObject<T>() where T : new()
{
return new T();
}
There’s a way to return the default value of T. However this returns the default value for an object which in most cases is null. Value types such as Int32 will return their default value, which in this case is 0.
FormatterServices.GetUninitializedObject
I covered this in my previous blog post. However here’s the short version.
var instance = (CoolObject)FormatterServices.GetUninitializedObject(typeof(CoolObject));
This particular one is strange though. It does not call any constructors. It does not initialize the object nor any of it’s fields/properties except to their default values.
Final
Hopefully this helps you. If I missed any please leave a comment!