【发布时间】:2019-10-17 13:28:09
【问题描述】:
我已经做了这个扩展方法(我知道现在没有异常检查等,一旦我确定函数实际上是正确的就会添加):
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 (var x in ...) x.Body = RemoveUnwantedTags(x.Body); }或类似的东西不是更简单吗?不需要反射、lambda 等 -
我同意@canton7,但我也知道 lambdas 目前是主流..
-
如果你真的想要,你可以定义例如一个
Tap方法,然后做_dc.EmailTemplates.Tap(x => x.Body = RemoveUnwantedTags(x.Body)).ToList(),但这开始有点味道,并且由于Linq 的懒惰性质可能会咬人 -
(另外,将
type.GetProperty(name)above 放在foreach循环中——相对而言,它非常昂贵,并且不依赖于x。) -
然后考虑类似于我上面描述的
Tap方法。c.SomeMethod(x => x.Body = RemoveUnwantedTags(x.Body))肯定比c.SomeMethod(x => x.Body, x => RemoveUnwatedTags(x.Body))好?
标签: c# lambda reflection extension-methods