Rob*_*cks 6 .net c# oop reflection code-generation
是否可以创建一个扩展方法来返回对象列表中的单个属性或字段?
目前我有很多功能,如下所示.
public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
List<int> speeds = new List<int>();
foreach (ObjectMotion motion in motions) {
speeds.Add(motion.Speed);
}
return speeds;
}
Run Code Online (Sandbox Code Playgroud)
这是"硬编码",仅在单个对象类型中提供单个属性.它很乏味,我确信有一种方法可以使用LINQ/Reflection来创建一个可以通用和可重用方式执行此操作的扩展方法.像这样的东西:
public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){
List<TProp> props = new List<TProp>();
foreach (ObjectMotion obj in objects) {
props.Add(obj.prop??);
}
return props;
}
Run Code Online (Sandbox Code Playgroud)
除了使用LINQ的最简单的方法,我也在寻找最快的方法.是否可以使用代码生成(和Lambda表达式树)在运行时创建这样的方法?我确信这比使用Reflection更快.
你可以这样做:
public static List<TProp> GetProperties<T, TProp>(this IEnumerable<T> seq, Func<T, TProp> selector)
{
return seq.Select(selector).ToList();
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
List<int> speeds = motions.GetProperties(m => m.Speed);
Run Code Online (Sandbox Code Playgroud)
这种方法是否比仅使用Select和ToList直接更好是值得怀疑的.
它是,不需要反思:
List<int> values = motions.Select(m=>m.Speed).ToList();
Run Code Online (Sandbox Code Playgroud)