6 Stimmen

Übergeben einer Klassenvariable als Parameter

Ich würde gerne eine Klassenproperty (oder einen Getter/Setter, wenn nötig) als Referenz an eine Funktion übergeben.

Zum Beispiel habe ich ein Array einer Klasse mit vielen booleschen Flags.

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

Ich kann eine Methode schreiben, die alle Instanzen von Flags zurückgibt, bei denen ein ausgewähltes Flag wahr ist

public Flags[] getAllWhereAisTrue(Flags[] array)
{
  List resultList = new List();
  for (int i = 0; i < array.Length; i++)
  {
    if (array[i].a == true) // für jedes Flags, bei dem a wahr ist
    {                       // füge es zur Ergebnisliste hinzu
      resultList.Add(array[i]);
    }
  }
  return resultList.ToArray(); // gib die Ergebnisliste als Array zurück
}

Was würde ich verwenden, um es mir zu ermöglichen, eine Klassenproperty als Parameter zu übergeben, um mich davon abzuhalten, diese Methode für jede boolesche Eigenschaft von Flags zu schreiben (in diesem Beispiel ist das dreimal, einmal für a, b und c)?

Ich versuche zu vermeiden, Flags ein Array von Booleans zu geben, um den resultierenden Code leicht lesbar zu halten. Ich schreibe eine Bibliothek für relativ unerfahrene Programmierer.

Danke

(Mit Entschuldigung, falls dies ein Duplikat von Passing property as parameter in method ist, ich kann nicht ganz feststellen, ob es dasselbe Problem ist)

7voto

BrokenGlass Punkte 153950

Sie könnten ein Func als Parameter verwenden:

public Flags[] getAllWhereAisTrue(Flags[] array, Func propertySelector)
{
    List resultList = new List();
    for (int i = 0; i < array.Length; i++)
    {
        if (propertySelector(array[i])) // für jedes Flags, für das a true ist
        {                       // füge es der Ergebnisliste hinzu
            resultList.Add(array[i]);
        }
    }
    return resultList.ToArray(); // gebe die Ergebnisliste als Array zurück
}

Dann könnten Sie es so verwenden:

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

Aber wirklich, Sie sollten dies nicht neu erfinden - Linq macht dies out of the box (beachten Sie die Ähnlichkeit):

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

Beide Lösungen erfordern, dass a, b, c öffentlich sind (sollte in diesem Fall wirklich eine öffentliche Eigenschaft sein)

0voto

mtijn Punkte 3520

Laut Spezifikation der Sprache ist es nicht möglich, Eigenschaften als Verweisparameter zu übergeben. Dieser Stackoverflow-Beitrag befasst sich mit dem gleichen Thema. Außerdem unterstütze ich den Kommentar von SLaks: LINQ hat eine Methode, die genau das macht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X