我如何使用委托作为参数调用此函数

时间:2011-02-09 01:48:28

标签: c# lambda delegates

我有重复的代码,我试图重构为一个泛型函数,从一个对象列表(所有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();
    }

3 个答案:

答案 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正被用作oINamed的对象)作为参数的函数。

修改

调用CheckboxList方法的示例:

CheckboxList(myItems, (n) => MyHandler(n), "myName");

答案 2 :(得分:0)

CheckBoxList(yourItems, x => x.SomeProperty == "foo", "yourName");