私はPro MVC 2の本を読んでおり、HtmlHelperクラスの拡張メソッドを作成する例があります。
ここにコード例:
public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl)
{
//Magic here.
}
そしてここに使用例があります:
[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>")
}
編集:この質問のpointを混乱させていた部分を削除しました。
問題は、なぜFuncを使用した例なのかです。いつ使用すべきですか? Funcとは何ですか?
ありがとう!
Func<int, string>
のような
Func<int, String> pageUrl = i => "Page" + i;
int
を唯一のパラメーターとして受け入れ、string
を返すデリゲートです。この例では、int
という名前のi
パラメーターを受け入れ、i
の標準文字列表現を文字列"Page" + i
に連結した文字列"Page"
を返します。
一般に、Func<TSource, TResult>
は、TSource
型のパラメーターを1つ受け入れ、TResult
型のパラメーターを返します。例えば、
Func<string, string> toUpper = s => s.ToUpper();
その後、あなたは言うことができます
string upper = toUpper("hello, world!");
または
Func<DateTime, int> month = d => d.Month;
だからあなたは言うことができます
int m = month(new DateTime(3, 15, 2011));
Func<int, String>
は、int
パラメーターを受け取り、結果としてString
を返すコールバックメソッドを意味します。
ラムダ式 と呼ばれる次の式:
Func<int, String> pageUrl = i => "Page" + i;
このようなものに展開します:
Func<int, String> pageUrl = delegate(int i)
{
return "Page" + i;
}
問い合わせているFunc<int, string>
行は、ラムダ式と呼ばれています。
Func<int, String> pageUrl = i => "Page" + i;
この行は、intパラメータ(i
)を取り、文字列"Page" + i
を返す関数として説明できます。
次のように書き直すことができます。
delegate(int i)
{
return "Page" + i;
}
これに関するブログ投稿があります。 Func
を使用すると、機能の不一致の一部を解決できます。 こちら をお読みください。
PageLinks
メソッドは 拡張メソッド であるためです。
拡張メソッドでは、最初のパラメーターはこのキーワードで始まり、最初のパラメーターで表される型の拡張メソッドであることを示します。
Func<T1, T2>
は、型T1
から型T2
への変換を表すデリゲートです。したがって、基本的には、PageLinks
メソッドはその変換をint
に適用してstring
を生成します。
Func<T, TResult>
:1つのパラメータを持つメソッドをカプセル化し、TResultパラメータで指定された型の値を返します。 詳細については、このページを参照してください と例。 :-)
自分で作る
Func<int,string> myfunc;
次に、Funcを右クリックして定義を表示します。あなたはそれが下層の代理人であることがわかります
public delegate TResult Func<in T, out TResult>(T arg);
Funcを使用してwhere()拡張メソッドを実装しました。ぜひご覧ください...
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;
}
}
}
次のように使用できます
foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) )
{
Console.WriteLine ( item );
}