我一定错过了 lambda 和委托的一些基础知识。来了。。
我有两个功能“几乎”相同的事情。我需要通过将它们写入一个函数并传递“必要”参数来对它们进行 OOP。
这两个函数大致是这样的:
private static bool Populate1(int yPoint)
{
//---------------------------------
//--------------------------------
int xPoint = 0;
foreach (var item in collection)
{
ComboBox cb = AddControl_Combo(item, xPoint, yPoint);
xPoint += cb.Width + 12;
yPoint = 0;
}
//-------------------------------
//-------------------------------
return true;
}
private static bool Populate2(int yPoint)
{
//---------------------------------
//--------------------------------
int xPoint = 0;
foreach (var item in collection)
{
ComboBox cb = AddControl_Combo(item, xPoint, yPoint);
yPoint += cb.Height + 12;
}
//---------------------------------
//--------------------------------
return true;
}
这些函数要冗长得多,所以我真的想把它们干掉。可以注意到,这两个函数的唯一区别是两个定位函数
xPoint += cb.Width + 12;
yPoint = 0;
和
yPoint += cb.Height + 12;
如何通过将上述表达式作为参数将上述两个函数合二为一?我发现的问题是变量xPoint
和cb
是函数范围内的变量!
这是我尝试并成功的方法,但在我看来并不优雅:
private static bool Populate(ref int xPoint, ref int yPoint, ref ComboBox cb,
Action positioningFunc)
{
foreach (var item in collection)
{
cb = AddControl_Combo(item, xPoint, yPoint);
positioningFunc();
}
return true;
}
并称之为:
int xPoint = 0;
int yPoint = 0;
ComboBox cb = null;
return Populate(ref xPoint, ref yPoint, ref cb, () =>
{
xPoint += cb.Width + 12;
yPoint = 0;
});
和
int xPoint = 0;
int yPoint = 19;
ComboBox cb = null;
return Populate(ref xPoint, ref yPoint, ref cb, () =>
{
yPoint += cb.Height + 12;
});
有没有更好的方法来 OOP 他们?
编辑:我试图传递位置的两个表达式是一些动态控件(水平、垂直、对角线、之字形等)。该函数已经从 4 个不同的地方调用并且可以扩展。为了获得表达式本身,我们从调用类中进行了大量计算。所以在函数if else
内部做一个逻辑Populate
(在一个单独的实用程序类中)不是我想要的。所有方法中唯一的变化是foreach中的那些定位表达式。所以我正在寻找在这种情况下如何传递参数。