2016-02-25 16 views
6

Questo genera un errore dicendo che non posso convertire il tipo ClassType a T. C'è qualche soluzione alternativa per questo?Fusioni oggetto di metodo di tipo generico

Esiste un modo per specificare che il tipo di thispuò infatti essere convertito in T?

public void WorkWith<T>(Action<T> method) 
{ 
    method.Invoke((T)this); 
} 

risposta

3

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.

+0

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

+0

upvoted e merita di essere accettato risposta rispetto a una risposta che era originariamente sbagliato e non contiene alcuna spiegazione ... –

+0

@ Selman22 Mi sento male per il poster originale, ma devo essere d'accordo. Cambiato. – KthProg

3
public void WorkWith<T>(Action<T> method) where T: ClassType { 
    method.Invoke((T)this); 
} 
+0

Grazie! Non ero sicuro di come limitare i tipi di template per i metodi! – KthProg

+0

siete i benvenuti –

+0

Mentre siete qui, avete idea di come specificare più classi possibili che derivano tutte da 'class'? Più classi elencate dopo 'dove T:' sembra spezzarlo. – KthProg

Problemi correlati