我有重复的代码,我试图重构为一个泛型函数,从一个对象列表(所有INamed列表)生成一个复选框列表。
第二个参数是一个委托,它将回调函数,但我无法弄清楚我将如何实际调用此方法。使用此委托调用方法的最佳方法是什么? (我正在寻找一个可以调用Checkboxlist函数的代码示例)
public delegate bool HasHandler(INamed named);
这是通用方法
static public string CheckboxList(IQueryable<INamed> allItems, HasHandler has, string name)
{
StringBuilder b = new StringBuilder();
foreach (var item in allItems)
{
if (has(item))
{
b.Append("<input type='checkbox' class='checkboxes' name='" + name + "' value=" + item.Id + " checked />" + item.Name);
}
else
{
b.Append("<input type='checkbox' class='checkboxes' name='" + name + "' value=" + item.Id + " />" + item.Name);
}
}
return b.ToString();
}
答案 0 :(得分:4)
你现在正在这样做:
if (has(item)) // This calls the delegate
调用方法中的委托。你拥有的语法是正确的,应该可行。
至于调用CheckboxList
- 听起来你需要定义委托。这可以是将“INamed”作为参数的任何方法,并返回一个布尔值。例如,如果你有:
private bool myHandler(INamed named)
{
return true;
}
你可以用以下方式调用:
string result = CheckboxList(items, myHandler, "Foo");
或者,你可以在这里传递一个lambda:
string result = CheckboxList(items, named => { return (named.Foo > 3); }, "Foo");
答案 1 :(得分:0)
很简单的例子:
public delegate bool HasHandler(INamed named);
// delete method matching HasHandler declaration
bool MyHandler(INamed named) {
return true;
}
// method that passes your implemented delegate method as a parameter
void MyOtherMethod() {
MyMethod(null, (n) => MyHandler(n)); // using lambda
MyMethod(null, MyHandler); // not using lambda
}
// method that uses your implemented delegate method
// this would be like your CheckboxList method
void MyMethod(INamed o, HasHandler handler) {
handler(o);
}
请注意,标识符handler
正被用作o
(INamed
的对象)作为参数的函数。
修改强>
调用CheckboxList
方法的示例:
CheckboxList(myItems, (n) => MyHandler(n), "myName");
答案 2 :(得分:0)
CheckBoxList(yourItems, x => x.SomeProperty == "foo", "yourName");