我想传递一个类属性(或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
}
我将使用什么来允许我将类属性作为参数传递,以免我不得不为Flags的每个布尔属性编写一次此方法(在此示例中为三次,一次为a,b和c)?
我试图避免为Flags提供一系列布尔值,以保证生成的代码易于阅读。我正在写一个供相对缺乏经验的程序员使用的库。
谢谢
(道歉,如果这是Passing property as parameter in method的欺骗,我无法确定它是否是同一个问题)
答案 0 :(得分:7)
您可以使用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是公开的(在这种情况下应该真的是公共财产)
答案 1 :(得分:0)
根据语言规范,不能将属性作为ref参数传递。 this stackoverflow post是同一主题。此外,我将继续SLaks的评论:LINQ有一个方法可以做到这一点。