Search code examples
c#reflectioninstantiationdefault-constructor

Creating instance of type without default constructor in C# using reflection


Take the following class as an example:

class Sometype
{
    int someValue;

    public Sometype(int someValue)
    {
        this.someValue = someValue;
    }
}

I then want to create an instance of this type using reflection:

Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);

Normally this will work, however because SomeType has not defined a parameterless constructor, the call to Activator.CreateInstance will throw an exception of type MissingMethodException with the message "No parameterless constructor defined for this object." Is there an alternative way to still create an instance of this type? It'd be kinda sucky to add parameterless constructors to all my classes.


Solution

  • I originally posted this answer here, but here is a reprint since this isn't the exact same question but has the same answer:

    FormatterServices.GetUninitializedObject() will create an instance without calling a constructor. I found this class by using Reflector and digging through some of the core .Net serialization classes.

    I tested it using the sample code below and it looks like it works great:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.Runtime.Serialization;
    
    namespace NoConstructorThingy
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyClass myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); //does not call ctor
                myClass.One = 1;
                Console.WriteLine(myClass.One); //write "1"
                Console.ReadKey();
            }
        }
    
        public class MyClass
        {
            public MyClass()
            {
                Console.WriteLine("MyClass ctor called.");
            }
    
            public int One
            {
                get;
                set;
            }
        }
    }
    

    With .NET 8 right around the corner and the obsoletion of the FormatterService

    You can use RuntimeHelpers.GetUninitializedObject, which is the same method that FormatterService.GetUninitializedObject was calling under the hood in the first place.