due possibili soluzioni:
Non typesafe:
public void WorkWith<T>(Action<T> method)
{
method.Invoke((T)(object)this);
}
Questo non è typesafe perché si può passare qualsiasi metodo che ha un unico parametro e non ritorno valore, come:
WorkWith((string x) => Console.WriteLine(x));
Il typesafe "versione" (usando i vincoli generici):
public class MyClass
{
public void WorkWith<T>(Action<T> method) where T : MyClass
{
method.Invoke((T)this);
}
}
Il punto qui è che, per essere in grado di lanciare this
al T
, il compilatore vuole essere sicuro che this
è sempre calcinabile per T
(quindi la necessità per il vincolo). Come mostrato nell'esempio non sicuro, la soluzione "classica" (non sicura) utilizzata con i generici passa attraverso un cast a object
.
Anche se l'utente di seguito potrebbe aver avuto la risposta sbagliata, era ambiguo, quindi l'ho modificato e accettato. Questa risposta è anche molto buona perché non era ambigua e mostra il risultato nel contesto di una spiegazione. Vorrei accettare entrambi, ma oh bene. – KthProg
upvoted e merita di essere accettato risposta rispetto a una risposta che era originariamente sbagliato e non contiene alcuna spiegazione ... –
@ Selman22 Mi sento male per il poster originale, ma devo essere d'accordo. Cambiato. – KthProg