2011-02-09 2 views
1

У меня есть повторяющийся код, который я пытаюсь реорганизовать в общую функцию для создания списка флажков из списка объектов (все списки 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(); 
    } 
+1

Вы получаете ошибку? –

+0

Как в стороне, всякий раз, когда вы строите HTML в методе, подобном этому, часто существует лучший способ. –

+0

@ Justin Morgan - есть ли у вас какие-либо конкретные предложения для этого примера? – leora

ответ

4

вы делаете это сейчас:

if (has(item)) // This calls the delegate 

что вызовы делегат в рамках метода. Синтаксис, который у вас есть, правильный и должен работать.


Как для вызова CheckboxList - это звучит, как вам нужно иметь делегат определен. Это может быть любой метод, который принимает «INamed» в качестве аргумента и возвращает логическое значение. Например, если у вас:

private bool myHandler(INamed named) 
{ 
    return true; 
} 

Вы могли бы назвать это с:

string result = CheckboxList(items, myHandler, "Foo"); 

В качестве альтернативы, вы можете передать лямбда здесь:

string result = CheckboxList(items, named => { return (named.Foo > 3); }, "Foo"); 
+0

i обновил вопрос, чтобы быть более ясным – leora

+0

@ooo - okay - обновил его немного ... –

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) в качестве параметра.

EDIT

Примером вызова метода CheckboxList:

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

i обновил вопрос, чтобы быть более понятным – leora

+0

@ooo: Обновлен мой ответ – bitxwise

0
CheckBoxList(yourItems, x => x.SomeProperty == "foo", "yourName"); 
Смежные вопросы