LINQ 如何将列表属性转换为数组?

15
什么是最好的方法来处理这个问题,其中PROPNAME可以是任何类型为T的属性?使用反射构建它,还是有一种很好的LINQ方式来处理它?
T[] vals = people.Select(x => x.PROPNAME).ToArray<T>();

这是我迄今为止最好的翻译:

    public T[] ConvertListCol<TFrom,T>(IEnumerable<TFrom> list, string col)
    {
        var typ = typeof (TFrom);
        var props = typ.GetProperties();
        var prop = (from p in props where p.Name == col select p).FirstOrDefault();
        var ret = from o in list select prop.GetValue(o, null);
        return ret.ToArray<T>();
    }

在返回值中出现错误...但已经接近成功了。虽然有点混乱,但还算可以接受。


你需要获取 people 对象的属性名称数组吗? - Russ Cam
你是想创建一个可重复使用的代码片段,可以指定任何属性并返回一组字符串表示吗? - Tejs
情况是有一个包含许多属性的大型Poco对象,而API希望一次只看到一列而不是一行。 - sgtz
Propname 何时被识别:设计时,编译时还是运行时? - Amy B
propname 在编译时已知,但我面临着一个包含 n 个 LINQ 语句的 switch 语句,或者基于反射的某些东西。希望能找到一些更加智能、高效和优雅的解决方案。 - sgtz
2个回答

29

使用非显式的var类型,它会自动生成类型

var names = people.Select(x => x.PROPNAME).ToArray();

9
如果使用var关键字,类型将被推断出来:
var names = people.Select(x => x.PROPNAME).ToArray();

没有一种动态的方法可以根据字符串重命名PROPNAME。请参见我最近编辑中添加的新信息“prop.GetValue(””。那是一个答案,但并不是非常高效。 - sgtz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接