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

C# 我如何使用委托作为参数调用此函数,c#,lambda,delegates,C#,Lambda,Delegates,我有重复的代码,我正试图重构成一个通用函数,从对象列表(所有INamed列表)生成一个复选框列表 第二个参数是一个委托,它将回调函数,但我不知道如何实际调用此方法。使用此委托调用方法的最佳方式是什么?(我正在寻找调用Checkboxlist函数的代码示例) 下面是通用方法 static public string CheckboxList(IQueryable<INamed> allItems, HasHandler has, string name) { S

我有重复的代码,我正试图重构成一个通用函数,从对象列表(所有INamed列表)生成一个复选框列表

第二个参数是一个委托,它将回调函数,但我不知道如何实际调用此方法。使用此委托调用方法的最佳方式是什么?(我正在寻找调用Checkboxlist函数的代码示例)

下面是通用方法

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();
    }
static public string CheckboxList(IQueryable allItems,HasHandler has,string name)
{
StringBuilder b=新的StringBuilder();
foreach(所有项目中的var项目)
{
如果(有(项目))
{
b、 追加(“+item.Name”);
}
其他的
{
b、 追加(“+item.Name”);
}
}
返回b.ToString();
}
您现在正在做:

if (has(item))  // This calls the delegate
在方法内调用委托的。您的语法是正确的,应该可以使用


至于调用
复选框列表
——听起来您需要定义委托。这可以是任何将“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");
您现在正在这样做:

if (has(item))  // This calls the delegate
在方法内调用委托的。您的语法是正确的,应该可以使用


至于调用
复选框列表
——听起来您需要定义委托。这可以是任何将“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");
非常简单的例子:

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);
}
请注意,标识符
处理程序
被用作函数,其中
o
(INamed的
对象
)作为参数

编辑

调用
复选框列表
方法的示例:

CheckboxList(myItems, (n) => MyHandler(n), "myName");
非常简单的例子:

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);
}
请注意,标识符
处理程序
被用作函数,其中
o
(INamed的
对象
)作为参数

编辑

调用
复选框列表
方法的示例:

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

另一方面,每当你用这样的方法构建HTML时,总会有更好的方法。@Justin Morgan-你对这个例子有什么具体的建议吗?在架构上,你希望把构建视图的代码(在这种情况下是网页?)放在一个地方,而不要让它泄漏到你的任何内部逻辑中。JSP、Django、ASP.NET等都有相应的机制。顺便说一句,每当你用这样的方法构建HTML时,通常会有更好的方法。@Justin Morgan-你对这个例子有什么具体的建议吗?在架构上,你想把构建视图的代码(本例中是网页?)放在一个地方,不要让它泄露到你的任何内在逻辑中。JSP、Django、ASP.NET等都有相应的机制。