2011-09-27 3 views
6

Je souhaite passer une propriété de classe (ou une propriété getter/setter si nécessaire) à une fonction.Transmission d'une propriété de classe en tant que paramètre

Par exemple, j'ai un tableau d'une classe avec beaucoup de drapeaux booléens.

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

Je peux écrire une méthode qui renvoie toutes les instances de drapeaux pour lesquels un drapeau choisi est vrai

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 
} 

Que dois-je utiliser pour me permettre de passer une propriété de classe en tant que paramètre, de façon pour me sauver d'avoir à écrire cette méthode une fois pour chaque propriété booléenne de Flags (dans cet exemple c'est trois fois, une fois pour a, b et c)? J'essaie d'éviter de donner à Flags un tableau de Booléens dans le but de garder le code résultant facile à lire. J'écris une bibliothèque pour utilisation par des codeurs relativement inexpérimentés.

Merci

(Avec nos excuses si cela est dupe de Passing property as parameter in method, je ne peux pas tout à fait dire si c'est le même problème)

+3

Vous pouvez remplacer toute votre méthode par une requête LINQ triviale. – SLaks

+1

+1 sur la question pour vérifier les doublons en premier. – wllmsaccnt

+0

duplicata possible de [Comment puis-je transmettre une propriété d'une classe en tant que paramètre d'une méthode?] (Http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-a-method) – nawfal

Répondre

7

Vous pouvez utiliser un Func<Flags, bool> comme paramètre:

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 
} 

Ensuite, vous pouvez utiliser comme ceci:

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

Mais vraiment vous ne devriez pas réinventer ce - Linq le fait de la boîte (remarquez la similitude):

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

Les deux solutions nécessiteraient l'a, b, c à être publique (qui devrait vraiment être un propriété publique dans ce cas)

+0

Code édité pour rendre les propriétés publiques. Je vais essayer votre code, et regarder dans Linq. THX –

0

Selon la spécification de langage, il n'est pas possible de transmettre des propriétés en tant que paramètres ref. this stackoverflow post est sur le même sujet. de plus, je vais appuyer le commentaire de SLaks: LINQ a une méthode qui ne fait que cela.

Questions connexes