È possibile, sebbene sia necessario fare attenzione con i parametri sui sovraccarichi, di solito è una buona idea evitare i tipi object
poiché ciò causa spesso codice confuso. Puoi cadere in un modo divertente in cui C# preleva i sovraccarichi. Sceglierà una corrispondenza più "ravvicinata" con tipi che possono essere espressi espressi in un "ulteriore" con corrispondenze esatte (vedere this question).
Button myButton = // get button
Window currentWindow = // get window
// which method is called here?
currentWindow.Display(myButton);
si desidera che il codice sia abbastanza chiaro, soprattutto quando si ritorna a questo codice in un anno o giù di lì, che cosa sovraccarico viene chiamato.
I metodi di estensione forniscono un modo davvero elegante di espandere la funzionalità degli oggetti. È possibile aggiungere un comportamento che non aveva in origine. Devi stare attento con loro, dato che sono molto inclini a creare codice confuso. È consigliabile evitare i nomi dei metodi già utilizzati, anche se sono sovraccarichi evidenti, poiché non vengono visualizzati dopo la lezione in intellisense.
Qui il problema sembra essere che il metodo di estensione può convertire implicitamente il tuo pulsante in un oggetto, e quindi sceglie se stesso come la migliore corrispondenza, invece del metodo di visualizzazione effettivo. È possibile chiamare esplicitamente il metodo di estensione come una normale chiamata statica, ma non è possibile forzarlo a chiamare il metodo della classe sottostante.
vorrei cambiare il nome del metodo di estensione:
object somethingToMakeIntoAButton = // get object
Window currentWindow = // get window
// which method is called here?
currentWindow.DisplayButton(somethingToMakeIntoAButton);
Poi ...
class WindowExtensions
{
public void DisplayButton(this Window window, object o)
{
Button button = BlahBlah(o);
// now it's clear to the C# compiler and human readers
// that you want the instance method
window.Display(button);
}
}
In alternativa, se il secondo parametro del metodo di estensione era un tipo che non potrebbe essere implicitamente convertito da Button
(ad esempio int
o string
) questa confusione non si verifica neanche.
Ciò che si ottiene in aggiunta è un'architettura infinitamente pessima;) SCNR – Thorsten79