繁体   English   中英

在一个类中声明静态方法并将其用作另一个类的方法

[英]Declaring a static method in one class and using it as a method of another class

我正在为ASP.NET MVC做Nerd Dinner教程 ,我在C#语言中遇到了一个看起来非常奇怪的构造。 这个问题的标题有点模糊,因为我无法定义这是什么。 这也使我很难搜索这个主题,因此我决定提出一个问题。

Nerd Dinner教程中,我看到以下代码片段:

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是当前类的属性,而不是它自己的类。

这是因为它是一种扩展方法 这就是第一个参数开头的“this”位。

扩展方法的想法是它们允许您有效地向现有类添加功能。 所以如果你有:

public static class StringExtensions
{
    public static string Reverse(this string text)
    {
        char[] chars = text.ToCharArray();
        Array.Reverse(chars);
        return new string(chars);
    }
}

然后你可以这样称呼它:

string x = "hello world";
string y = x.Reverse();

这实际上是编译好像你写的:

string x = "hello world";
string y = StringExtensions.Reverse(x);

必须在顶级非泛型静态类中声明扩展方法。 它们在LINQ中被大量使用。

这种观察确实是正确的; 这是一个扩展方法 ,如参数类型之前的this修饰符所示:

this ModelStateDictionary modelState

然后编译器将解析对方法的调用, 看起来ModelStateDictionary的实例方法,但请注意它实际上仍然静态调用 - 所以:

obj.SomeStaticMethod(arg1, arg2);

实际编译为:

TheDeclaringType.SomeStaticMethod(obj, arg1, arg2);

这可能导致诸如obj奇怪现象可能为null ,并且调用仍然有效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM