【问题标题】:Passing a class property as a parameter将类属性作为参数传递
【发布时间】:2011-09-27 12:51:10
【问题描述】:

我想传递一个类属性(或者如果需要,一个 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;
  }
}

我可以编写一个方法,返回所选标志为真的标志的所有实例

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 的每个布尔属性编写一次此方法(在此示例中为 3 次,一次用于 a,b c)?

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

谢谢

(如果这是Passing property as parameter in method的骗子,我很抱歉,我不太清楚这是否是同一个问题)

【问题讨论】:

标签: c# generics parameters properties


【解决方案1】:

您可以使用Func&lt;Flags, bool&gt; 作为参数:

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 是公开的(在这种情况下应该是公开的)

【讨论】:

  • 编辑代码以公开属性。我会试试你的代码,看看 Linq。谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多