2009-06-09 7 views
6

Sono sicuro che la risposta è qualcosa di ovvio, e sono un po 'imbarazzato che non conosco già la risposta, ma considero il seguente esempio di codice che ho rilevato leggendo "Professional ASP.NET MVC 1.0":Che cosa significa "questo" quando usato come prefisso per i parametri del metodo?

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

capisco ciò che questo metodo statico sta facendo, ma quello che non capisco è quale scopo la parola "questo" sta scontando nella firma del metodo. Qualcuno può illuminarmi?

risposta

17

Questa è una nuova funzionalità C# 3.0 denominata extension method.

Significa che si aggiunge un nuovo metodo agli oggetti ModelStateDictionary. Si può chiamare come un metodo normale:

yourModelStateDictionary.AddRuleViolations(errors); 

Sede, che il primo parametro (il 'this'-parametro) viene saltata. Assegna solo ModelStateDictionary come destinazione valida per il tuo metodo di estensione.

L'indizio è che è possibile farlo con qualsiasi classe, anche classi sigillate o di terze parti, come. Classi di framework. NET (ad esempio su oggetti o stringhe).

+0

Non avrei potuto metterlo meglio di me stesso – TWith2Sugars

1

Significa che il metodo in questione è un "metodo di estensione" e può essere chiamato come se fosse un metodo della classe stessa. Vedi questo article.

1

Si tratta di una firma del metodo estensione, significa che il "AddRuleViolations" saranno trattati come un metodo di estensione ModelStateDictionary.

Da MSDN.

metodi di estensione consentono di "aggiungere" metodi per tipi esistentisenza creazione di un nuovo tipo derivato, ricompilazione o altrimenti modificare il tipo di originale. I metodi di estensione sono un tipo speciale di metodo statico, ma vengono chiamati come se fossero metodi di istanza sul tipo esteso. Per il codice client scritto in C# e Visual Basic, non vi è alcuna differenza apparente tra metodo di estensione e i metodi che sono effettivamente definiti in un tipo.

Problemi correlati