如何在对象列表中收集单个属性?

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更快.

Lee*_*Lee 7

你可以这样做:

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直接更好是值得怀疑的.


Ste*_*rov 6

它是,不需要反思:

List<int> values = motions.Select(m=>m.Speed).ToList();
Run Code Online (Sandbox Code Playgroud)