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