first commit
This commit is contained in:
55
MyNewProjectName.Application/Mappings/MappingProfile.cs
Normal file
55
MyNewProjectName.Application/Mappings/MappingProfile.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user