Як я можу передати параметр у дії?


75
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>));

Ідея полягає у передачі кожного методу включення.


Це ваша Actionлише варіація Actionчи це Action<T>будь-яка інша варіація? Скільки параметрів потрібно?
BoltClock

Схоже, ви вже передаєте включення через includesаргумент. Є ідея, що ви хочете передати кожного члена includesсписку action? Якщо так, просто передайте _context.Cars.Include(без дужок).
itowlson

Так, ідея полягає в тому, щоб передати кожне включення в метод _context.Cars.Include ()
Jop

@itowlson все ще не може цього досягти.
Jop

Яку помилку ви бачите? Що таке підпис _context.Cars.Includeметоду? Оновлена ​​відповідь Scrum Meister здається мені правильною, але, мабуть, метод Cars.Include може потребувати адаптації, щоб взяти рядок ...?
itowlson

Відповіді:


111

Якщо ви знаєте, який параметр ви хочете передати, візьміть a 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);
}

ідея полягає в тому, щоб передати кожне включення методу _context.Cars.Include ()
Jop

За допомогою цього коду (код з оновлення) Помилка отримання: 'System.Data.Objects.ObjectQuery <Repository.Entity.Car> System.Data.Objects.ObjectQuery <Repository.Entity.Car> .Include (string)' має неправильне повернення type
Jop

@jop Оновлено, Створіть нового Action<string>представника, який викликає Cars.Include. Як варіант, ваш власний метод Include може прийняти aFunc<string, whatever type Cars.Include() returns>
The Scrum Meister

Конвенція полягає в тому, що загальний варіант повинен мати аргумент T з назвою arg, а не параметр.
magnusarinell

15

Ви шукаєте Action<T>, що приймає параметр.


Можливо, ви захочете додати другу T.
Слакс

ідея полягає в тому, щоб передати кожне включення методу _context.Cars.Include ()
Jop

10

Брудна хитрість: Ви також можете використовувати лямбда-вираз для передачі будь-якого коду, який вам потрібен, включаючи виклик із параметрами.

this.Include(includes, () =>
{
    _context.Cars.Include(<parameters>);
});

Мені це подобається, тому що я мав утиліту, яку вже використовували в багатьох місцях, і я не приймав Action<T>- це дозволяє мені все ще використовувати це без змін.
GregHNZ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.