Как я могу передать параметр в Action?

private void Include(IList<string> includes, Action action)
{
    if (includes != null)
    {
        foreach (var include in includes)
            action(<add include here>);
    }
}

Я хочу назвать это так

this.Include(includes, _context.Cars.Include(<NEED TO PASS each include to here>));

Идея состоит в том, чтобы передать каждое включение в метод.


person Jop    schedule 11.02.2011    source источник
comment
Ваш Action просто Action или это Action<T> или любой другой вариант? Сколько параметров вы хотите?   -  person BoltClock    schedule 11.02.2011
comment
Похоже, вы уже передаете включения через аргумент includes. Идея состоит в том, что вы хотите передать каждого члена списка includes в список action? Если это так, просто передайте _context.Cars.Include (без скобок).   -  person itowlson    schedule 11.02.2011
comment
Да, идея состоит в том, чтобы передать каждое включение в метод _context.Cars.Include().   -  person Jop    schedule 11.02.2011
comment
@itowlson до сих пор не может этого добиться.   -  person Jop    schedule 11.02.2011
comment
Какую ошибку вы видите? Какова подпись метода _context.Cars.Include? Обновленный ответ Scrum Meister мне кажется правильным, но я предполагаю, что метод Cars.Include может нуждаться в адаптации для приема строки...?   -  person itowlson    schedule 11.02.2011
comment
Получение ошибки: «System.Data.Objects.ObjectQuery‹Repository.Entity.Car› System.Data.Objects.ObjectQuery‹Repository.Entity.Car›.Include(string)» имеет неправильный тип возвращаемого значения. Подпись: public ObjectQuery‹T› Include(string path);   -  person Jop    schedule 11.02.2011


Ответы (3)


Если вы знаете, какой параметр вы хотите передать, возьмите Action<T> для типа. Пример:

void LoopMethod (Action<int> code, int count) {
     for (int i = 0; i < count; i++) {
         code(i);
     }
}

Если вы хотите, чтобы параметр передавался вашему методу, сделайте метод универсальным:

void LoopMethod<T> (Action<T> code, int count, T paramater) {
     for (int i = 0; i < count; i++) {
         code(paramater);
     }
}

И код вызывающего абонента:

Action<string> s = Console.WriteLine;
LoopMethod(s, 10, "Hello World");

Обновлять. Ваш код должен выглядеть так:

private void Include(IList<string> includes, Action<string> action)
{
    if (includes != null)
    {
         foreach (var include in includes)
             action(include);
    }
}

public void test()
{
    Action<string> dg = (s) => {
        _context.Cars.Include(s);
    };
    this.Include(includes, dg);
}
person The Scrum Meister    schedule 11.02.2011
comment
идея состоит в том, чтобы передать каждое включение в метод _context.Cars.Include() - person Jop; 11.02.2011
comment
С этим кодом (код из обновления) Получение ошибки: «System.Data.Objects.ObjectQuery‹Repository.Entity.Car› System.Data.Objects.ObjectQuery‹Repository.Entity.Car›.Include(string)» имеет неправильный возврат тип - person Jop; 11.02.2011
comment
@jop Обновлено: создайте новый делегат Action<string>, который вызывает функцию Cars.Include. Кроме того, ваш собственный метод Include может принимать Func<string, whatever type Cars.Include() returns> - person The Scrum Meister; 11.02.2011
comment
Соглашение заключается в том, что общий вариант должен иметь аргумент T с именем arg, а не параметр. - person magnusarinell; 24.03.2016

Вы ищете Action<T>, который принимает параметр.

person SLaks    schedule 11.02.2011
comment
Вы можете добавить второй T. - person SLaks; 11.02.2011
comment
идея состоит в том, чтобы передать каждое включение в метод _context.Cars.Include() - person Jop; 11.02.2011

Грязный трюк: вы также можете использовать лямбда-выражение для передачи любого кода, включая вызов с параметрами.

this.Include(includes, () =>
{
    _context.Cars.Include(<parameters>);
});
person ne2dmar    schedule 25.11.2014
comment
Мне это нравится, потому что во многих местах уже использовался служебный класс, который не принимал Action<T> — это позволяет мне по-прежнему использовать его без изменений. - person GregHNZ; 18.08.2020
comment
Это должен быть принятый ответ, но это так просто. - person Chris; 10.06.2021