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用作前缀,在您的情况下,HtmlHelpertype要扩展BeginForm的方法,是应该扩展它的方法。

看看这个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# 深度”。这里有一段摘录:http: //my.safaribooksonline.com/book/programming/csharp/9781935182474/extension-methods/ch10lev1sec3

您当然可以在线购买这本书,或者您可以使用 Google 对它的幕后工作原理进行一些研究。

于 2013-02-23T00:10:23.480 回答