我正在为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