我正在爲ASP.NET MVC做Nerd Dinner tutorial,我遇到了一種C#語言的構造,這看起來很奇怪。這個問題的標題有點含糊,因爲我很難定義這是什麼。這也使我很難搜索這個話題,因此我決定提出一個問題。在一個類中聲明一個靜態方法並將它用作另一個類的方法
在Nerd Dinner tutorial我看到下面的代碼片段:
public static class ControllerHelpers {
public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {
foreach (RuleViolation issue in errors) {
modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
}
}
後來他們表明:
//
// GET: /Dinners/Edit/2
public ActionResult Edit(int id) {
Dinner dinner = dinnerRepository.GetDinner(id);
return View(dinner);
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {
Dinner dinner = dinnerRepository.GetDinner(id);
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(dinner);
}
}
讓我困惑的部分是:
public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors)
和
ModelState.AddRuleViolations(dinner.GetRuleViolations());
看起來您在ControllerHelpers
類中定義AddRuleViolations
函數,然後像調用ModelState
屬性的實例函數那樣調用它。這個觀察是否正確?如果是,爲什麼你需要這個?我覺得在一個類中定義一個方法就好像它是另一個類的方法一樣。
注意:ModelState
是當前類的屬性,而不是它自己的類。
啊謝謝。如果沒有擴展方法關鍵字,我找不到任何關於它的內容。 – 2010-11-18 14:06:42