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.


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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.