将类属性作为参数传递

And*_*tin 6 c# generics parameters properties

我想传递一个类属性(或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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以编写一个方法来返回所选标志为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
}
Run Code Online (Sandbox Code Playgroud)

我将使用什么来允许我将类属性作为参数传递,以便使我不必为Flags的每个布尔属性编写一次此方法(在此示例中为三次,一次为a,b和c) ?

我试图避免给Flags一个布尔数组,以试图保持生成的代码易于阅读.我正在写一个供相对缺乏经验的程序员使用的库.

谢谢

(如果这是在方法中作为参数传递属性的欺骗,请道歉,我不能确定它是否是同一个问题)

Bro*_*ass 7

您可以使用Func<Flags, bool>as参数:

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
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var allAFlagsSet = getAllWhereAisTrue(flagsArray, x=> x.a);
Run Code Online (Sandbox Code Playgroud)

实际上你不应该重新发明这一点 - Linq开箱即用(注意相似性):

var allAFlagsSet = flagsArray.Where(x=> x.a).ToArray();
Run Code Online (Sandbox Code Playgroud)

两种解决方案都要求a,b,c是公开的(在这种情况下应该真的是公共财产)