public class BaseTypeClass {}
public class BaseTypeV1 : BaseTypeClass {}
public class BaseTypeV2 : BaseTypeClass {}
public class BaseTypeV3 : BaseTypeClass {}
public interface IProcessBaseType
void Process(BaseTypeClass baseType);
public interface IProcessBaseType<T> : IProcessBaseType where T : BaseTypeClass
void Process(T baseType);
public class ProcessBassTypeClass : IProcessBaseType
public void Process(BaseTypeClass data)
Console.WriteLine("Processing as BaseTypeClass");
public void Process<T>(T data)
Console.WriteLine("Processing as generic with T = {0}", typeof(T).Name);
static public void Main(string[] args)
var processor = new ProcessBassTypeClass();
processor.Process( new BaseTypeClass() );
processor.Process( new BaseTypeV1() );
processor.Process( new BaseTypeV2() );
processor.Process( new BaseTypeV3() );