как бы я вызвал эту функцию с делегатом в качестве параметра - PullRequest
1 голос
/ 09 февраля 2011

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

4 голосов
/ 09 февраля 2011

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

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 голосов
/ 09 февраля 2011
CheckBoxList(yourItems, x => x.SomeProperty == "foo", "yourName");
0 голосов
/ 09 февраля 2011

Очень простой пример:

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...