using System.Collections.Generic;
public static void Main()
var executor = new ConverterExecutor(new Dictionary<Type, IConverter<SharedBaseClass, SharedBaseClass>>{
{typeof(InputClass), 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, IConverter<SharedBaseClass,SharedBaseClass>> _converters;
public ConverterExecutor(Dictionary<Type, IConverter<SharedBaseClass, SharedBaseClass>> converters)
_converters = converters;
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.Convert(toConvert));
converted.Add(toConvert);