2011-08-31 9 views
13

Qual è il modo migliore per fare ciò in cui PROPNAME potrebbe essere una qualsiasi proprietà di tipo T? Costruiscilo con la riflessione, o c'è un buon modo LINQ per farlo?LINQ elenca la proprietà all'array?

T[] vals = people.Select(x => x.PROPNAME).ToArray<T>(); 

questo è il migliore che abbia avuto finora:

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>(); 
    } 

ottenuto un errore nel ritorno ... ma sempre più vicino. Va tutto bene, ma un po 'più di quanto avessi sperato.

+0

Sei dopo una matrice dei nomi di proprietà di 'persone'? –

+0

Stai provando a creare una parte di codice riutilizzabile in cui è possibile specificare qualsiasi proprietà e recuperare il set di rappresentazioni stringa? La situazione di – Tejs

+0

è che esiste un oggetto poco esteso di molte proprietà e un'API vorrebbe vederle una colonna alla volta anziché una riga alla volta. – sgtz

risposta

23

Utilizzando un tipo var non esplicito, genererà automaticamente il tipo per voi

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

Grazie mille JLevett !!! –

7

Il tipo sarà dedotto se si utilizza la parola chiave var:

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

buono! i nomi saranno un array di qualsiasi tipo x.PROPNAME è –

+0

non esiste un modo dinamico per rinominare un PROPNAME in base a una stringa. Vedi le nuove informazioni "prop.GetValue (" che ho inserito in una modifica recente. Questa è una risposta, tuttavia, non è proprio così efficiente. – sgtz

Problemi correlati