2011-08-31 73 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