2013-02-23 3 views
16
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, похоже, не принимается в качестве параметра. Похож на реальные методы BeginForm:Что означает ключевое слово this this в параметре метода?

BeginForm(string actionName, string controllerName); 

Отсутствует первый параметр. Но он фактически получает этот первый параметр как-то скрытым образом. Не могли бы вы объяснить мне, как работает эта структура. Я действительно изучаю интернет-образец MVC 4. Спасибо.

+11

Это метод расширения - http://msdn.microsoft.com/en-us/library/ vstudio/bb383977.aspx – aush

+0

Отправляйся, я пройду через это. – INgeek

ответ

26

Вот как работают методы расширения на C#. Функция Extension Methods позволяет расширять существующие типы с помощью настраиваемых методов. this [TypeName] ключевого слова в контексте параметров методы является type, что вы хотите расширить с пользовательскими методами, то this используются в качестве префикса, в вашем случае, HtmlHelper является type расширить и 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); 

Ссылки:

+0

это очень аккуратное объяснение, спасибо – INgeek

+0

@INgeeg Добро пожаловать! –

+0

@YairNevet Должен ли этот метод быть объявлен как «статический» для этого? – thatWiseGuy

2

Метода расширения:

«болт» способ продлить существующий тип. Они позволяют расширить существующий тип с помощью новых функций без необходимости подкласса или перекомпилировать старый тип. Например, вам может потребоваться узнать, была ли определенная строка номером или нет. Или вы можете иметь функцию Show() Hide() в ASP.net WebForms для элементов управления.

Для примера:

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); 
    } 
} 

Edit: Для подробной информации вы можете увидеть в документации 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.

+3

ссылка не должна быть вашим ответом.Пожалуйста, предоставьте некоторые детали, чтобы ваш ответ оставался в одиночестве. – psubsee2003

+5

Специально не ссылка на контент, который не является общедоступным или не бесплатным. –

+0

@JohnSaunders хороший момент, я даже не щелкнул – psubsee2003

Смежные вопросы