2009-03-14 13 views
17

Il modo più semplice per spiegare cosa intendo è con un esempio di codice. Questo non si compila, ma c'è un modo per ottenere questo effetto:Puoi usare i metodi generici in C# se il tipo è sconosciuto fino al runtime?

foreach(Type someType in listOfTypes) 
{ 
    SomeMethod<someType>(); 
} 

sarebbe veramente conveniente se che avrebbe funzionato, ma non è così. C'è un altro modo per ottenere la stessa cosa di cui sopra, e perché C# non consente che ciò sia una dichiarazione legale?

Modifica: Sembra che l'unico modo per farlo sia attraverso la riflessione che potrebbe essere troppo lenta per le nostre esigenze. Qualche idea sul perché non è stato creato un modo efficiente e se qualcosa del genere è in lavorazione per C# 4.0?

+0

Non sono sicuro di cosa stai cercando di ottenere qui. Potresti fornire più contesto e/o una spiegazione di ciò che SomeMethod deve fare (e perché deve farlo per un elenco di tipi), per favore? – Noldorin

+0

Sì, puoi farlo con la riflessione come altri hanno già detto ma tieni presente che la riflessione è sanguinosa. Se le prestazioni sono importanti nel tuo caso, considera un altro approccio. –

+0

Ho bisogno di indicizzare tutti i tipi nel nostro database degli oggetti senza preoccuparmi di quando vengono aggiunti o rimossi nuovi tipi, ecc. – Davy8

risposta

22

È possibile utilizzare la riflessione. Supponendo che l'oggetto corrente contiene il metodo SomeMethod(), il codice per farlo sarebbe simile a questa:

GetType().GetMethod("SomeMethod"). 
    MakeGenericMethod(new Type[] { someType }).Invoke(this, null); 

Nota che se SomeMethod() è non-pubblico, il codice non può eseguire in ambienti a basso fiducia.

23

Perché C# non consente che sia una dichiarazione legale?

Come altri hanno notato, non è possibile farlo. Perchè no? Beh, prendere in considerazione il tuo esempio:

foreach(Type someType in listOfTypes) 
{ 
    SomeMethod<someType>(); 
} 

Si noti che ogni tipo nell'elenco dei tipi non può essere conosciuto fino runtime, mentre il parametro tipo di SomeMethod deve essere noto al momento della compilazione . È impossibile per il compilatore comunicare a qualeSomeMethod<T> risolvere il tuo invito, quindi questo è illegale.

In C# 4, questo e molti altri aspetti simili saranno possibili con l'inclusione del DLR nel CLR. In particolare, la chiamata al metodo dinamico consentirà di richiamare metodi che potrebbero non essere noti in fase di compilazione.

+0

Vorrei poter contrassegnare 2 risposte accettate poiché immagino di aver fatto 2 domande. – Davy8

+3

Non preoccuparti, non provare brutti scherzi! StackOverflow è pieno di buone risposte che non sono accettate. Hai scelto quello che ha catturato quello che volevi dire di più - sto solo aggiungendo qualche piccola informazione in più ai curiosi.;) –

+0

Ora che C# 4 è stato rilasciato puoi aggiornare la tua risposta con un esempio usando 'dynamic' –

Problemi correlati