我已经制定了这种扩展方法(我现在知道没有异常检查等,一旦我确定函数实际上是正确的,便会添加它:]
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();
但是我不喜欢这样,我必须使用双lambda,一个用于获取属性名称,然后一个用于执行功能。我不知道这是我对Expression <>的工作原理缺乏了解,还是我错过了一些确实很明显但很感谢的帮助!
ForEach
中的List<T>
如何使用,所需功能可以简化为