Можно ли убрать необходимость в двойной лямбде в этом обобщенном выражении? - PullRequest
0 голосов
/ 17 октября 2019

Я сделал этот метод расширения (я знаю, что сейчас нет проверки исключений и т. Д., Он будет добавлен, как только я уверен, что функция на самом деле правильная):

public static IEnumerable<TSource> ChangeProperty<TSource, TResult>(this IEnumerable<TSource> source,Expression<Func<TSource,TResult>> res, Func<TSource, TResult> changeProp)
    {
        Type type = typeof(TSource);
        MemberExpression member = res.Body as MemberExpression;
        var name = member.Member.Name;

        foreach (var x in source)
        {
            var prop = type.GetProperty(name);
            prop.SetValue(x, changeProp(x));
            Console.WriteLine(prop.GetValue(x));
        }
        return source;
    }

И используется в этомконтекст (удаление ненужных тегов убирает теги html из строки):

_dc.EmailTemplates
.ChangeProperty(x=>x.Body,z=>RemoveUnwantedTags(z.Body))
.ToList();

Но мне не нравится, что мне нужно использовать двойную лямбду, одну для получения имени свойства, а затем одну для выполненияфункция. Я не знаю, является ли это моим непониманием того, как работает Expression <>, или я упускаю что-то действительно очевидное, но буду очень признателен за помощь!

1 Ответ

2 голосов
/ 17 октября 2019

Аналогично тому, как ForEach используется в List<T>, желаемая функциональность может быть упрощена до

public static IEnumerable<TSource> Apply<TSource>(this IEnumerable<TSource> source, Action<TSource> action) {
    foreach (var item in source) {
        action(item);
        yield return item;            
    }        
}

и использоваться

_dc.EmailTemplates
    .Apply(x => x.Body = RemoveUnwantedTags(x.Body))
    .ToList();

Это также может использоваться для нескольких членовделая

_dc.EmailTemplates
    .Apply(x => {
        x.Body = RemoveUnwantedTags(x.Body);
        x.SomeOtherMember = SomeOtherFunction(x.SomeOtherMember);
    })
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...