public static void Main()
var templatedBase = new Templated<Base>();
var myDerived = new Derived();
templatedBase.Test(myBase);
templatedBase.Test(myDerived);
var templatedDerived = new Templated<Derived>();
templatedDerived.Test(myDerived);
public class Base : ICloneable
public virtual object Clone()
public class Derived : Base
public override object Clone()
public class Templated<T> where T : Base
public void Test(T input)
var clone = input.Clone();
Console.WriteLine(clone.GetType());