22
namespace System.Web.Mvc.Html
{
    // Summary:
    //     Represents support for HTML in an application.
    public static class FormExtensions
    {
        public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName);
...
    }
}

BeginForm メソッドの最初のパラメーターの前にある 'this' オブジェクトがパラメーターとして受け入れられないようです。実際の BeginForm メソッドは次のように機能します。

BeginForm(string actionName, string controllerName);

最初のパラメーターを省略します。しかし、実際には、最初のパラメーターを何らかの形で隠された方法で受け取ります。この構造のしくみを教えてください。私は実際にMVC 4インターネットサンプルを調査しています。ありがとうございました。

4

2 に答える 2

36

これは、C# で拡張メソッドがどのように機能するかです。拡張メソッド機能により、既存の型をカスタム メソッドで拡張できます。this [TypeName]メソッドのパラメーターのコンテキスト内のキーワードはtype、カスタム メソッドで拡張するthisものであり、プレフィックスとして使用されます。この場合、拡張するものでHtmlHelperあり、拡張する必要があるメソッドです。typeBeginForm

stringタイプのこの単純な拡張メソッドを見てください。

public static bool BiggerThan(this string theString, int minChars)
{
  return (theString.Length > minChars);
}

stringオブジェクトで簡単に使用できます。

var isBigger = "my string is bigger than 20 chars?".BiggerThan(20);

参考文献:

于 2013-02-23T00:21:16.367 に答える
3

拡張方法:

既存のタイプを拡張する「ボルトオン」の方法。古い型をサブクラス化または再コンパイルすることなく、既存の型を新しい機能で拡張できます。たとえば、特定の文字列が数値かどうかを知りたい場合があります。または、コントロール用の ASP.net WebForms に Show() Hide() 機能が必要な場合があります。

例えば:

public static class MyExtensionMethods
{
    public static void Show(this Control subject)
    {
        subject.Visible = true;
    }
    public static bool IsNumeric(this string s)
    {
        float output;
        return float.TryParse(s, out output);
    }
}

編集: 詳細については、MSDN のドキュメント ( http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx ) を参照してください。これは、@aush によって親切にリンクされています。

拡張メソッドに関する「C# In Depth」を楽しく読みました。ここに抜粋があります: http://my.safaribooksonline.com/book/programming/csharp/9781935182474/extension-methods/ch10lev1sec3

もちろん、本をオンラインで購入することも、Google を使用して内部でどのように機能するかを調査することもできます。

于 2013-02-23T00:10:23.480 に答える