CSharp · Console
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
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 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, 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);
if (converter != null) {
converted.Add(converter(toConvert));
continue;
}
converted.Add(toConvert);
}
return converted;
}
}