3 Stimmen

Übergabe eines Arguments an Func<> in MVC-Helper

Ich habe den folgenden Code aus dem Internet gestohlen gesehen. Die Methodensignatur lautet:

public static MvcHtmlString RecordPager(this HtmlHelper html, PagingInfoModel pageInfo, Func someUrl )

Dies wird im View wie folgt aufgerufen:

@Html.RecordPager(Model.PagingInfoModel, x => Url.Action("Index", new { page = x }) )

Meine Frage bezieht sich speziell auf den letzten Parameter, ich verstehe nicht ganz, wie du das Argument x => Url.Action("Index", new { page = x }) in den Parameter übergeben kannst

Func someUrl

Ich weiß, dass dies eine Erweiterungsmethode für MVCs HtmlHelper ist, usw. und Func ist ein Delegat, der eine int erwartet und eine string zurückgibt, aber wo ist das int im Argument x => Url.Action usw...

Vielleicht hast du bemerkt, dass ich Lambda, LINQ und anonyme Funktionen und all diesen modernen Kram nicht verstehe, aber bitte gib eine anständige Erklärung für Dumme wie mich, die auf dieselbe Frage stoßen werden. Danke.

2voto

Yuval Itzchakov Punkte 144903

Ein Func ist im Grunde ein Delegat mit der folgenden Signatur:

public delegate string Func(int I)

Vor C# 2 war der einzige Weg, eine Methode an einen Delegaten (der ein Zeiger auf eine Funktion ist) zu übergeben, das explizite Erstellen einer benannten Methode mit derselben Signatur wie der oben angegebene Delegat, wie zum Beispiel:

public string MyAwsomeFunc(int I)

Und diese Methode konnte an eine Methode übergeben werden, die den Delegaten als Parameter enthält:

public void SomeFunc(Func callback)

C# 2 führte Anonyme Methoden ein, die es uns ermöglichten, Delegaten-Handler "auf die Schnelle" zu erstellen und den Compiler die benannte Methode für uns erstellen zu lassen:

// Einen Delegaten erstellen. 
delegate string Func(int x);

// Den Delegaten mit einer anonymen Methode instanziieren.
Func d = delegate(int k) { /* ... */ };

C# 3 führte uns Lambda-Ausdrücke ein, die der bevorzugte Weg sind, um Delegaten in C# zu behandeln. Ein Lambda-Ausdruck ist eine anonyme Methode, die Sie verwenden können, um einen Delegaten zu erstellen. Durch die Verwendung von Lambda-Ausdrücken können Sie lokale Funktionen schreiben, die als Argumente übergeben oder als Rückgabewert von Funktionsaufrufen verwendet werden können:

delegate int del(int i);

del myDelegate = x => x * x // Lamda-Ausdruckssyntax
int j = myDelegate(5); //j = 25

Was in Ihrer Methode passiert, ist, dass sie einen Delegattyp von Func akzeptiert und die Lamda-Ausdruckssyntax verwendet:

 x => Url.Action("Index", new { page = x }) )

x ist der Eingabeparameter für Func, der ein int ist und der der page-Eigenschaft zugewiesen wird, und die Url.Action-Methode gibt einen String zurück, was der erwartete Rückgabetyp ist. Der Compiler erstellt den Delegatenhandler für uns, sodass wir das nicht manuell tun müssen. Es wäre dasselbe wie bei der Verwendung des folgenden Ansatzes mit einer benannten Methode:

string MyMethod(int I)
{
    string result = Url.Action("index", new { page = I });
    return result;
}

Dann MyMethod als Parameter senden:

@Html.RecordPager(Model.PagingIngModel, MyMethod(someInt));

Bearbeiten

Einige Lektüre:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X