Как я могу вызвать метод, принимающий действие <ISomeInterface>вместе с методом ISomeInterface - PullRequest
0 голосов
/ 03 апреля 2019

Я использую Automapper, где я пытаюсь вызвать следующий метод:

 IMappingExpression ForMember(string name, 
    Action<IMemberConfigurationExpression> memberOptions)

Во втором параметре Action содержит интерфейс с методом

   void MapFrom<TSourceMember>(Expression<Func<TSource, TSourceMember>>
         mapExpression)

Для этого метода я создаллокальный метод, который возвращает

expression<func<object,string>>

Теперь я запутался, как я могу динамически вызывать метод ForMember, передавая необходимые параметры, которые у меня есть.

Ниже приводится ожидаемый результат, которого я хочу достичь динамически:

 map.ForMember(x.Key, opt => opt.MapFrom<string>(LocalMethod<object>(x.Value)));

Где map - это объект конфигурации Automapper, а LocalMethod возвращает выражение в следующем виде:

 public static Expression<Func<T, string>> DefaultFilter1<T>(string fieldName)
    { 
    }

Я сделал это следующим образом:

var mapMethodInfo = map.GetType()
                     .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic)
                     .Where(m => m.Name.EndsWith("ForMember"))
                     .FirstOrDefault();


                        var lamda = this.GetType().GetMethod("CreateMapFromExpression").MakeGenericMethod(baseType).Invoke(this, new object[] { x.Value });

                        var actionTypeCast = typeof(Action<>).MakeGenericType(typeof(IMemberConfigurationExpression<,,>).MakeGenericType(baseType, t, typeof(string)));
                        var action = new Action<IMemberConfigurationExpression>(proxy =>
                      {
                          var miMemberExpList = proxy.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic)
                .Where(m => m.Name.EndsWith("MapFrom")).ToList();

                          var miMemberExp = miMemberExpList[11];                         
                          miMemberExp.MakeGenericMethod(typeof(string)).Invoke(proxy, new object[] { lamda });

                      });

                        var result = mapMethodInfo.Invoke(map, new object[] { x.Key, action });
...