Передача свойства класса в качестве параметра - PullRequest
6 голосов
/ 27 сентября 2011

Я хотел бы передать свойство свойства (или метод получения / установки, если необходимо) ссылку на функцию.

Например, у меня есть массив класса с большим количеством логических флагов.

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

Я могу написать метод, который возвращает все экземпляры Flags, для которых выбранный флаг является истинным

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
}

Что бы я использовал, чтобы позволить мне передать свойство класса в качестве параметра,чтобы избавить меня от необходимости писать этот метод один раз для каждого логического свойства Flags (в этом примере это три раза, один раз для a, b и c)?

Я стараюсь не давать Flagsмассив логических значений в попытке сделать результирующий код легким для чтения.Я пишу библиотеку для использования сравнительно неопытными программистами.

Спасибо

(С извинениями, если это обман Передача свойства в качестве параметра в методе , яне могу точно сказать, если это та же проблема)

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

Вы можете использовать Func<Flags, bool> в качестве параметра:

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
}

Тогда вы можете использовать его так:

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

Но действительно Вы не должны изобретать это заново - Linq делает это из коробки (обратите внимание на сходство):

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

Оба решения требуют, чтобы a, b, c были публичными (должны действительно быть публичными)свойство в данном случае)

0 голосов
/ 27 сентября 2011

в соответствии со спецификацией языка невозможно передать свойства в качестве параметров ref. это сообщение о переполнении стека относится к той же теме.более того, я добавлю комментарий SLaks: у LINQ есть метод, который делает именно это.

...