以下代码是否存在Linq等效项,其中Properties
是对象T中的属性列表,而entry
是T的实例。
我发现我经常这样编码,我想知道是否有更简单明了的方法来使用linq。
List<Object> args = new List<Object>();
for (int i = 0; i < Properties.Count; i++)
args.Add(typeof(T).GetProperty(Properties[i]).GetValue(entry));
答案 0 :(得分:1)
这应该是等效的,使用Select
方法:
var args = Properties
.Select(p => typeof(T).GetProperty(p))
.Select(p => p.GetValue(entry))
.ToList();
你当然可以将整个typeof(T).GetProperty(p).GetValue(entry)
部分放在一个Select
中 - 我为了清楚起见将其拆分了。请注意,它在内存/性能方面没有太大区别 - 它不会在中间创建任何额外的集合,因为LINQ被懒惰地评估,并且在ToList
调用之前它不会“运行”。
答案 1 :(得分:1)
您正在将属性转换为值,这意味着您可以使用Select
方法:
var args = Properies.Select( p => typeof(T).GetProperty(p).GetValue(entry) );
答案 2 :(得分:1)
var args = Properties
.Select(x=> typeof(T).GetProperty(x).GetValue(entry))
.ToList();
答案 3 :(得分:1)
Properties.Select(t => typeof(T).GetProperty(t).GetValue(entry)).ToList();
现在如果经常使用,只需创建一个扩展方法(在静态助手类中)
public static IList<object> GetValuesFor<T>(this IEnumerable<string> properties, T instance) {
return properties.Select(t => typeof(T).GetProperty(t).GetValue(instance)).ToList();
}
和用法
var args = Properties.GetValuesFor(entry);