Files
CleanArchitecture-template/MyNewProjectName.Application/Mappings/MappingProfile.cs
2026-02-26 14:04:18 +07:00

56 lines
1.6 KiB
C#

using System.Reflection;
using AutoMapper;
namespace MyNewProjectName.Application.Mappings;
/// <summary>
/// AutoMapper profile that auto-registers mappings from IMapFrom interface
/// </summary>
public class MappingProfile : Profile
{
public MappingProfile()
{
ApplyMappingsFromAssembly(Assembly.GetExecutingAssembly());
}
private void ApplyMappingsFromAssembly(Assembly assembly)
{
var mapFromType = typeof(IMapFrom<>);
var mappingMethodName = nameof(IMapFrom<object>.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 });
}
}
}
}
}
}