lundi 26 août 2019

automapper map with reflection

i'm trying to make an automapper helper function that checks conversion of enums (where i've custom business logic in mappers)
mapper is an instance, non static.

            var cfgExp = new MapperConfigurationExpression();
            cfgExp.AddProfile<ProfileXXX>()
            MapperConfiguration mapConfig = new MapperConfiguration(cfgExp);
            IMapper mapper = new Mapper(mapConfig);
            mapper.ConfigurationProvider.AssertConfigurationIsValid();
            mapper.AssertEnumConversion(cfgExp);

public static void AssertEnumConversion(this IMapper @thisMapper, MapperConfigurationExpression cfgExp) { try { if (@thisMapper == null) throw new ArgumentNullException(nameof(@thisMapper));

            List<TypePair> enumMapping = cfgExp
              .Profiles
              .SelectMany(x => x.TypeMapConfigs)
              .Where(x => x.Types.SourceType.IsEnum)
              .Select(x => x.Types)
              .ToList();


            MethodInfo methodMap = @thisMapper
                .GetType()
                .GetMethods()
                .Where(x => x.Name == "Map" && x.IsGenericMethod)
                .ToList()[0];//here i've seen 6 mappers  take first //TDestination Map<TDestination>(object source)

            foreach (var item in enumMapping)
            {
                Type tSource = item.SourceType;
                Type tDest = item.DestinationType;

                //here i've an helper to take a ienumerable<Enum>
                MethodInfo method = typeof(EnumConverters).GetMethod("GetEnumValues");
                MethodInfo methodGenericSource = method.MakeGenericMethod(tSource);
                object enumsSource = methodGenericSource.Invoke(null, null);

                IEnumerable<int> enumIenumInt = enumsSource as IEnumerable<int>;
                if (enumIenumInt == null)
                    throw new ApplicationException($"enumIenumInt==null ({tSource.FullName} to {tDest.FullName})");

                Array enumArray = Array.CreateInstance(tDest, enumIenumInt.Count());
                foreach (var e in enumArray)
                {
                    MethodInfo methodMapGeneric = methodMap.MakeGenericMethod(tDest);
                    methodMapGeneric.Invoke(@thisMapper, new object[1] { e });//here i've exeption
                }
            }
        }
        catch (Exception e)
        {
            throw;
        }

but i receive exception like mapper is not initialized... where i'm wrong!?!?





Aucun commentaire:

Enregistrer un commentaire