将类属性作为参数传递

本文关键字:参数传递 属性 | 更新日期: 2023-09-27 18:09:55

我想传递一个类属性(或getter/setter,如果需要的话)引用到一个函数

例如,我有一个类的数组,其中有许多布尔标志。

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

我可以写一个方法,返回所选标志为true的所有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
}

我要用什么来允许我传递一个类属性作为参数,以节省我不得不为标志的每个布尔属性写一次这个方法(在这个例子中,这是三次,一次为a, b和c)?

我试图避免给Flags一个布尔值数组,以保持结果代码易于阅读。我正在写一个库,供相对没有经验的程序员使用。

谢谢

(抱歉,如果这是传递属性作为方法参数的欺骗,我不能完全告诉它是否是相同的问题)

将类属性作为参数传递

您可以使用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是公共的(在这种情况下应该是一个公共属性)

根据语言规范,不可能将属性作为ref参数传递。这个stackoverflow帖子是关于同一主题的。此外,我支持SLaks的评论:LINQ有一个方法可以做到这一点。