using System.Collections.Generic;
public static void Main()
var executor = new ConverterExecutor();
executor.RegisterConverter(new DestinationConverter());
var result = executor.ConvertMultiple(new List<SharedBaseClass>{new InputClass()});
Console.WriteLine(result.First());
public class SharedBaseClass {}
public class DestinationClass : SharedBaseClass {
public DestinationClass(){}
public class InputClass : SharedBaseClass {
public interface IConverter<out TU, T> where TU : SharedBaseClass where T: SharedBaseClass
public TU Convert(T input);
public class DestinationConverter: IConverter<DestinationClass, InputClass> {
public DestinationClass Convert(InputClass input) {
return new DestinationClass();
public class ConverterExecutor
private readonly Dictionary<Type, Func<SharedBaseClass, SharedBaseClass>> _converters = new();
public void RegisterConverter<TU, T>(IConverter<TU, T> converter) where TU : SharedBaseClass where T : SharedBaseClass
_converters[typeof(T)] = x => converter.Convert((T)x);
public IEnumerable<SharedBaseClass> ConvertMultiple(IEnumerable<SharedBaseClass> classesToConvert)
var converted = new List<SharedBaseClass>();
foreach(var toConvert in classesToConvert)
_converters.TryGetValue(toConvert.GetType(), out var converter);
converted.Add(converter(toConvert));
converted.Add(toConvert);