DEV Community

loading...

C# Create new T()

rickystam profile image Ricky Stam Updated on ・1 min read

For a long time now whenever i had to create a new instance of a generic type parameter i was using Activator.CreateInstace(Type) method
https://msdn.microsoft.com/en-us/library/wccyzw83.aspx

Example:

public class Dog : ISound
{
    public string Sound { get; set; } = "woof woof";
}

public class Animal<T> where T : ISound
{
    public ISound GetInstance()
    {
        return (ISound)Activator.CreateInstance(typeof(T));
    }
}

Recently i stumbled upon the new constraint keyword from the MS docs (somehow i missed that 😞)
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-constraint
and the Generic class of Animal above can be rewritten as following:

public class Animal<T> where T : ISound, new()
{
    public T GetInstance()
    {
        return new T();
    }
}

and can be used:

var animal = new Animal<Dog>();
var dog = animal.GetInstance();
var sound = dog.Sound; //woof woof

Important: When you use the new() constraint with other constraints, it must be specified last.

This post was written with love ❤️

Discussion (1)

pic
Editor guide
Collapse
ahedreville profile image
Alexandre Hedreville • Edited

the drawback for this is that you need to have no constructors or a public parameter less constructor