using System.Reflection; using AutoMapper; namespace MyNewProjectName.Application.Mappings; /// /// AutoMapper profile that auto-registers mappings from IMapFrom interface /// public class MappingProfile : Profile { public MappingProfile() { ApplyMappingsFromAssembly(Assembly.GetExecutingAssembly()); } private void ApplyMappingsFromAssembly(Assembly assembly) { var mapFromType = typeof(IMapFrom<>); var mappingMethodName = nameof(IMapFrom.Mapping); bool HasInterface(Type t) => t.IsGenericType && t.GetGenericTypeDefinition() == mapFromType; var types = assembly.GetExportedTypes() .Where(t => t.GetInterfaces().Any(HasInterface)) .ToList(); var argumentTypes = new Type[] { typeof(Profile) }; foreach (var type in types) { var instance = Activator.CreateInstance(type); var methodInfo = type.GetMethod(mappingMethodName); if (methodInfo != null) { methodInfo.Invoke(instance, new object[] { this }); } else { var interfaces = type.GetInterfaces().Where(HasInterface).ToList(); if (interfaces.Count > 0) { foreach (var @interface in interfaces) { var interfaceMethodInfo = @interface.GetMethod(mappingMethodName, argumentTypes); interfaceMethodInfo?.Invoke(instance, new object[] { this }); } } } } } }