2012-02-17 9 views
9

Ho una classe MyDummyClass a cui vorrei passare alcune proprietà sotto forma di espressione Lambda per una valutazione successiva. Quindi quello che posso fare qualcosa di simileIl modo migliore per passare un elenco di nomi di proprietà come Lambda Expressions

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> property) 
    { 
     ... 
    } 
    ... 
} 

..e poi usare quella classe come new MyDummyClass<Person>(x=>x.Name), giusto?

Ma poi mi piacerebbe passare non solo una singola proprietà ma un elenco di proprietà. Quindi mi piacerebbe scrivere la mia classe come

public class MyDummyClass<T> 
{ 
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties) 
    { 
     ... 
    } 
    ... 
} 

e mi piacerebbe come per usarlo come new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname }) ma purtroppo questo non funziona! Invece devo scrivere

new MyDummyClass<Person> 
    (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname}); 

ma questo è un po 'scomodo per scrivere, non è vero? Certamente, usare i parametri funzionerebbe, ma questo è solo un esempio di un pezzo di codice più complicato in cui utilizzando parametri non è un'opzione. qualcuno ha un'opzione migliore di uscire da questo ??

+3

Perché non vuoi usare 'params'? È l'approccio più semplice e funzionerà senza specificare il tipo di delegato. –

+0

Anche io voto per i param. Manterrà la sintassi molto accurata e dietro le quinte usa un array che è ciò che volevi fare in primo luogo! – Umair

+0

Certo, in questo semplice esempio lo farebbe, ma l'ho preso da uno più complesso in cui non posso usare params poiché ci sono altri parametri opzionali tra cui non funzionerebbe quindi ... purtroppo – Juri

risposta

3

Si potrebbe provare:

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> expression) 
    { 
     NewArrayExpression array = expression.Body as NewArrayExpression; 
     foreach(object obj in (IEnumerable<object>)(array.Expressions)) 
     { 
      Debug.Write(obj.ToString()); 
     } 
    } 
} 

E poi si sarebbe chiamata esso così:

Il problema è che questo non ti darà il valore della proprietà perché nessuna istanza di Persona effettiva specificata Facendo un ToString su "obj" ti darà il nome della proprietà. Non so se questo è quello che cerchi, ma forse è un punto di partenza.

+0

L'estrazione del percorso della proprietà in seguito non è un problema, l'ho già fatto ... ma il tuo approccio potrebbe essere possibile. – Juri

+0

Penso che il vantaggio principale di questo approccio sia che il passaggio delle proprietà nel costruttore (secondo snippet) ha una sintassi più semplice, meno complessa e vicina a ciò che hai menzionato nel tuo post originale. – MotoSV

+0

Ho un problema quando la classe Person ha proprietà con tipi diversi. Ad esempio, conterrà una proprietà Age (int). Qualche aiuto?[Aggiornamento] usando il nuovo oggetto [] a destra – fravelgue

6

Try usando params invece:

public MyDummyClass(params Expression<Func<T, object>>[] properties) 

allora si dovrebbe essere in grado di fare:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname); 
+0

Grazie per le modifiche, ho scritto quello sul treno sul mio iPhone ... –

+0

Ovviamente, so che funzionerebbe con params, non posso usarlo nella mia situazione specifica. Perché ci sono alcuni parametri opzionali in mezzo e quindi non funziona ... – Juri

+0

Molto dolce .. proprio quello che il dr. ordinato!! – gcoleman0828

Problemi correlati