2009-06-09 22 views
6

Estoy seguro de que la respuesta es algo obvio, y estoy avergonzado de que realmente no sé la respuesta, pero considere la siguiente muestra de código que recogí mientras leía "Professional ASP.NET MVC 1.0":¿Qué significa "esto" cuando se usa como un prefijo para los parámetros del método?

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

entiendo lo que este método estático está haciendo, pero lo que no entiendo es qué propósito la palabra "esto" está sirviendo en la firma del método. ¿Alguien puede iluminarme?

Respuesta

17

Esa es una nueva característica de C# 3.0 llamada extension method.

Significa que agrega un nuevo método a sus objetos ModelStateDictionary. Se le puede llamar como un método normal:

yourModelStateDictionary.AddRuleViolations(errors); 

Sede, que el primer parámetro (el 'this'-parámetro) se omite. Asigna solo ModelStateDictionary como un objetivo válido para su método de extensión.

La clave es que se puede hacer esto con cualquier clase, incluso con clases selladas o de terceros, como las clases de .NET Framework (por ejemplo, en objetos o cadenas).

+0

No podría haberlo dicho mejor – TWith2Sugars

1

Significa que el método en cuestión es un "método de extensión" y se puede llamar como si fuera un método de la propia clase. Vea esto article.

1

Es una firma de método extensión, significa que la "AddRuleViolations" serán tratados como un método de extensión de ModelStateDictionary.

Desde MSDN.

Los métodos de extensión le permiten "agrega" métodos para tipos existentessin creación de un nuevo tipo derivado, recompilación, o de otra manera modificar el tipo original. Los métodos de extensión son un tipo especial de método estático, pero se llaman como si fueran métodos de instancia en el tipo extendido. Para el código de cliente escrito en C# y Visual Basic, no hay aparente diferencia entre llamar a un método de extensión y los métodos que están realmente definidos en un tipo.

Cuestiones relacionadas