.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	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 InputClass(){}
}

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);
			
			if (converter != null) {
				converted.Add(converter.Convert(toConvert));
				continue;
			}
							  
			converted.Add(toConvert);
		}
		
		return converted;
	}
}
;