当用作方法参数的前缀时,“this”是什么意思?

时间:2009-06-09 20:52:26

标签: c# extension-methods language-features

我确定答案是显而易见的,我有点不好意思我还不知道答案,但请考虑下面的代码示例,我在阅读“Professional ASP.NET MVC 1.0”时选择了:

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

我理解这个静态方法正在做什么,但我不明白的是“this”这个词在方法签名中的用途是什么。谁能开导我?

5 个答案:

答案 0 :(得分:17)

这是一个名为extension method的新C#3.0功能。

这意味着,您向ModelStateDictionary对象添加了一个新方法。您可以像普通方法一样调用它:

yourModelStateDictionary.AddRuleViolations( errors );

请注意,跳过第一个参数('this'参数)。它只将ModelStateDictionary指定为扩展方法的有效目标。

线索是,您可以使用任何类 - 甚至密封或第三方类,例如.Net框架类(例如对象或字符串)来执行此操作。

答案 1 :(得分:1)

这意味着所讨论的方法是一个“扩展方法”,并且可以被调用,就像它是类本身的方法一样。请参阅此article

答案 2 :(得分:1)

这是一个扩展方法签名,它意味着“AddRuleViolations”将被视为ModelStateDictionary的扩展方法。

来自MSDN。

  

扩展方法可让您“添加”   现有类型 没有的方法   创建一个新的派生类型,   重新编译或以其他方式修改   原始类型。扩展方法   是一种特殊的静态方法,   但他们被称为好像他们一样   扩展类型的实例方法。   对于用C#编写的客户端代码   Visual Basic,没有明显的   呼叫之间的区别   扩展方法和方法   实际上是在一个类型中定义的。

答案 3 :(得分:0)

答案 4 :(得分:0)

它向ModelStateDictionary的所有实例添加extension method