Я использую 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 });