2012-02-17 6 views
9

Tengo una clase MyDummyClass a la que me gustaría pasar algunas propiedades en forma de expresión Lambda para una evaluación posterior. Entonces, ¿qué puedo hacer algo comoLa mejor manera de pasar una lista de nombres de propiedades como Lambda Expressions

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

..y luego usar esa clase como new MyDummyClass<Person>(x=>x.Name), ¿verdad?

Pero me gustaría pasar no solo una propiedad sino una lista de propiedades. Así que me gustaría escribir mi clase como

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

y me como usarlo como new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname }) pero por desgracia no funciona ! En su lugar tengo que escribir

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

Pero esto es un poco incómodo de escribir, ¿no? Por supuesto, usar params funcionaría, pero esto es solo una muestra de un fragmento de código más complicado donde usando params no es una opción. ¿Alguien tiene una mejor opción para salir de esto?

+3

¿Por qué no quieres usar 'params'? Es el enfoque más simple, y funcionará sin especificar el tipo de delegado. –

+0

Yo también voto por params. Mantendrá la sintaxis muy clara y detrás de las escenas utiliza una matriz que es lo que quería hacer en primer lugar! – Umair

+0

Claro, en este simple ejemplo sería, pero lo saqué de uno más complejo donde no puedo usar params ya que hay otros parámetros opcionales entre los cuales no funcionaría ... lamentablemente – Juri

Respuesta

3

Usted podría intentar:

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

Y luego lo llamaría como este:

MyDummyClass<Person> cls = new MyDummyClass<Person>(item => new[] { item.Name, item.Surname }); 

El problema es que esto no le dará el valor de la propiedad porque no hay una instancia de persona real que especifique. Hacer un ToString en "obj" le dará el nombre de la propiedad. No sé si esto es lo que buscas, pero quizás sea un punto de partida.

+0

Extraer el camino de la propiedad después no es un problema, ya lo tengo ... pero, tu enfoque podría ser posible. – Juri

+0

Creo que el principal beneficio de este enfoque es que pasar las propiedades al constructor (segundo fragmento) tiene una sintaxis más simple, menos incómoda, y que es similar a lo que mencionaste en tu publicación original. – MotoSV

+0

Tengo un problema cuando la clase Persona tiene propiedades con diferentes tipos. Por ejemplo, contendrá una propiedad Age (int). ¿Un poco de ayuda?[Actualizar] usando el nuevo objeto [] es correcto – fravelgue

6

Intente utilizar params lugar:

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

, entonces debería ser capaz de hacer:

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

Gracias por las ediciones, escribí eso en el tren en mi iPhone ... –

+0

Por supuesto, sé que funcionaría con params, no puedo usarlo en mi situación específica. Porque hay algunos params opcionales en el medio y por lo tanto no funciona ... – Juri

+0

Muy dulce ... justo lo que el dr. ¡¡ordenado!! – gcoleman0828

Cuestiones relacionadas