2011-09-27 25 views
6

Me gustaría pasar una referencia de propiedad de clase (o un getter/setter si es necesario) a una función.Pasar una propiedad de clase como un parámetro

Por ejemplo, tengo una matriz de una clase con muchos indicadores booleanos.

class Flags 
{ 
    public bool a; 
    public bool b; 
    public bool c; 
    public string name; 

    public Flags(bool a, bool b, bool c, string name) 
    { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.name = name; 
    } 
} 

puedo escribir un método que devuelve todas las instancias de Banderas para el que una bandera elegido es cierto

public Flags[] getAllWhereAisTrue(Flags[] array) 
{ 
    List<Flags> resultList = new List<Flags>(); 
    for (int i = 0; i < array.Length; i++) 
    { 
    if (array[i].a == true) // for each Flags for which a is true 
    {      // add it to the results list 
     resultList.Add(array[i]); 
    } 
    } 
    return resultList.ToArray(); //return the results list as an array 
} 

¿Qué iba a utilizar para permitirme pasar una propiedad de clase como un parámetro, con el fin para evitar que tenga que escribir este método una vez por cada propiedad booleana de Flags (en este ejemplo, eso es tres veces, una vez para a, byc)

Estoy tratando de evitar dar a los indicadores una variedad de booleanos en un intento de mantener el código resultante fácil de leer. Estoy escribiendo una biblioteca para uso de codificadores relativamente inexpertos.

Gracias

(Con perdón si esto es una víctima de Passing property as parameter in method, yo no puedo decir si es la misma edición)

+3

Puede reemplazar todo su método con una consulta trivial LINQ. – SLaks

+1

+1 en la pregunta para buscar primero los duplicados. – wllmsaccnt

+0

posible duplicado de [¿Cómo puedo pasar una propiedad de una clase como parámetro de un método?] (Http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-a-method) – nawfal

Respuesta

7

Se puede usar un Func<Flags, bool> como parámetro:

public Flags[] getAllWhereAisTrue(Flags[] array, Func<Flags, bool> propertySelector) 
{ 
    List<Flags> resultList = new List<Flags>(); 
    for (int i = 0; i < array.Length; i++) 
    { 
     if (propertySelector(array[i])) // for each Flags for which a is true 
     {      // add it to the results list 
      resultList.Add(array[i]); 
     } 
    } 
    return resultList.ToArray(); //return the results list as an array 
} 

Entonces podría utilizar de esta manera:

var allAFlagsSet = getAllWhereAisTrue(flagsArray, x=> x.a); 

Pero realmente no debe reinventar esto - LINQ hace esto fuera de la caja (nótese la similitud):

var allAFlagsSet = flagsArray.Where(x=> x.a).ToArray(); 

Ambas soluciones requerirían el a, b, c sea público (en realidad debería ser una propiedad pública en este caso)

+0

Código editado para hacer que las propiedades sean públicas. Probaré tu código y miraré a Linq. Gracias –

0

según la especificación de idioma no es posible pasar propiedades como parámetros de referencia. this stackoverflow post está en el mismo tema. además, voy a secundar el comentario de SLaks: LINQ tiene un método que hace justamente esto.

Cuestiones relacionadas