Wie kann ich einen Parameter in Aktion übergeben?

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

Ich möchte es so nennen

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

Die Idee ist, jedes Include an die Methode zu übergeben.

Jop
quelle
Ist Ihr Actionnur eine Actionoder ist es eine Action<T>oder eine andere Variante? Wie viele Parameter möchten Sie?
BoltClock
Es sieht so aus, als würden Sie die Includes bereits über das includesArgument übergeben. Ist die Idee, dass Sie jedes Mitglied der includesListe an die übergeben möchten action? Wenn ja, einfach bestehen _context.Cars.Include(ohne Klammern).
Itowlson
Ja, die Idee ist, jedes Include an die Methode _context.Cars.Include () zu übergeben
Jop
@itowlson kann dies immer noch nicht erreichen.
Jop
Welchen Fehler sehen Sie? Was ist die Signatur der _context.Cars.IncludeMethode? Die aktualisierte Antwort des Scrum Meisters sieht für mich richtig aus, aber ich denke, die Cars.Include-Methode muss möglicherweise angepasst werden, um eine Zeichenfolge aufzunehmen ...?
Itowlson

Antworten:

108

Wenn Sie wissen, welchen Parameter Sie übergeben möchten, nehmen Sie ein Action<T>für den Typ. Beispiel:

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

Wenn der Parameter an Ihre Methode übergeben werden soll, machen Sie die Methode generisch:

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

Und der Anrufercode:

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

Aktualisieren. Ihr Code sollte folgendermaßen aussehen:

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);
}
Der Scrum Meister
quelle
Die Idee ist, jedes Include an die Methode _context.Cars.Include () zu übergeben
Jop
Mit diesem Code (Code aus Update) Fehler erhalten: 'System.Data.Objects.ObjectQuery <Repository.Entity.Car> System.Data.Objects.ObjectQuery <Repository.Entity.Car> .Include (Zeichenfolge)' hat die falsche Rückgabe Typ
Jop
@jop Aktualisiert, Erstellen Sie einen neuen Action<string>Delegaten, der die aufruft Cars.Include. Alternativ könnte Ihre benutzerdefinierte Include-Methode aFunc<string, whatever type Cars.Include() returns>
The Scrum Meister
Konvention ist, dass die generische Variante das Argument T mit dem Namen arg haben sollte, nicht den Parameter.
Magnusarinell
15

Sie suchen Action<T>, was einen Parameter nimmt.

SLaks
quelle
Möglicherweise möchten Sie eine Sekunde hinzufügen T.
SLaks
Die Idee ist, jedes Include an die Methode _context.Cars.Include () zu übergeben
Jop
10

Schmutziger Trick: Sie können auch den Lambda-Ausdruck verwenden, um jeden gewünschten Code zu übergeben, einschließlich des Aufrufs mit Parametern.

this.Include(includes, () =>
{
    _context.Cars.Include(<parameters>);
});
ne2dmar
quelle
Ich mag das, weil ich an vielen Stellen bereits eine Utility-Klasse verwendet habe, die keine akzeptiert hat Action<T>- so kann ich diese weiterhin ohne Änderung verwenden.
GregHNZ