2011-08-31 47 views
13

请问PROPNAME可能是T类型的任何财产吗?用反射来构建它,还是有一个很好的LINQ方法来做到这一点?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>(); 
    } 

得到了在返回一个错误......但越来越近。没关系,但是比我希望的有点混乱。

+0

你一个阵列中后“人”的财产名称? –

+0

您是否试图制作可重用的代码片段,您可以在其中指定任何属性并获取字符串表示形式的集合? – Tejs

+0

情况是有很多属性的大型poco对象,并且API希望一次只能看到一列,而不是一次一行。 – sgtz

回答

23

使用非明确的VAR的类型,它会自动生成类型为你

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

非常感谢JLevett! –

7

,如果你使用var关键字的类型将被推断:

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

不错!名称将是任何类型的数组x.PROPNAME是 –

+0

没有动态的方式来根据字符串重命名PROPNAME。看到新的信息“prop.GetValue(”,我把它放在最近的编辑。这是一个答案,但是,它不是真的那么高效。 – sgtz