Je lis le livre Pro MVC 2, et voici un exemple de création d'une méthode d'extension pour la classe HtmlHelper.
Voici l'exemple de code:
public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl)
{
//Magic here.
}
Et voici un exemple d'utilisation:
[Test]
public void Can_Generate_Links_To_Other_Pages()
{
//Arrange: We're going to extend the Html helper class.
//It doesn't matter if the variable we use is null
HtmlHelper html = null;
PagingInfo pagingInfo = PagingInfo(){
CurrentPage = 2,
TotalItems = 28,
ItemsPerPage = 10
};
Func<int, String> pageUrl = i => "Page" + i;
//Act: Here's how it should format the links.
MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl);
//Assert:
result.ToString().ShouldEqual(@"<a href=""Page1"">1</a><a href=""Page2"">2</a><a href=""Page3"">3</a>")
}
Edit: Partie supprimée qui a confondu le point de cette question.
La question est: pourquoi l'exemple utilise-t-il Func? Quand devrais-je l'utiliser? Qu'est ce que Func?
Merci!
Un Func<int, string>
comme
Func<int, String> pageUrl = i => "Page" + i;
est un délégué qui accepte int
comme seul paramètre et renvoie une string
. Dans cet exemple, il accepte un paramètre int
nommé i
et renvoie la chaîne "Page" + i
qui concatène simplement une représentation sous forme de chaîne standard de i
avec la chaîne "Page"
.
En général, Func<TSource, TResult>
accepte un paramètre de type TSource
et renvoie un paramètre de type TResult
. Par exemple,
Func<string, string> toUpper = s => s.ToUpper();
alors vous pouvez dire
string upper = toUpper("hello, world!");
ou
Func<DateTime, int> month = d => d.Month;
alors tu peux dire
int m = month(new DateTime(3, 15, 2011));
Func<int, String>
signifie une méthode de rappel qui prend un paramètre int
et retourne une String
comme résultat.
L'expression suivante, connue sous le nom de expression lambda :
Func<int, String> pageUrl = i => "Page" + i;
se développe à quelque chose comme ceci:
Func<int, String> pageUrl = delegate(int i)
{
return "Page" + i;
}
La ligne Func<int, string>
à laquelle vous vous adressez est appelée expression lambda.
Func<int, String> pageUrl = i => "Page" + i;
Cette ligne peut être décrite comme une fonction qui prend un paramètre int (i
) et retourne une chaîne "Page" + i
;
Il peut être réécrit comme:
delegate(int i)
{
return "Page" + i;
}
Avoir un blog sur ce sujet. En utilisant Func
, vous pouvez résoudre certaines divergences fonctionnelles. Lire ici .
Parce que la méthode PageLinks
est une Méthode d'extension .
Dans la méthode d'extension, le premier paramètre commence par ce mot-clé pour indiquer qu'il s'agit d'une méthode d'extension du type représenté par le premier paramètre.
Le Func<T1, T2>
est un délégué qui représente une transformation du type T1
au type T2
. Donc, fondamentalement, votre méthode PageLinks
appliquera cette transformation à int
pour produire un string
.
Func<T, TResult>
: encapsule une méthode qui a un paramètre et renvoie une valeur du type spécifié par le paramètre TResult. Voir cette page pour plus de détails et des exemples. :-)
Crée le tien
Func<int,string> myfunc;
puis cliquez avec le bouton droit sur Func pour afficher la définition. Vous verrez que c'est un délégué sous-jacent
public delegate TResult Func<in T, out TResult>(T arg);
J'ai implémenté une méthode d'extension where () en utilisant Func, jetez un oeil ...
public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method )
{
foreach ( var data in a )
{
//If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return)
if ( Method.Invoke ( data ) )
{
yield return data;
}
}
}
Vous pouvez l'utiliser comme,
foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) )
{
Console.WriteLine ( item );
}