2010-05-19 21 views
11

Sto cercando di convertire il valore del valore di T parametro di tipo generico in integer dopo essersi assicurati che T è in realtà intero:Come convertire il valore di Argomento di tipo generico in un tipo concreto?

public class Test 
{ 
    void DoSomething<T>(T value) 
    { 
     var type = typeof(T); 
     if (type == typeof(int)) 
     { 
      int x = (int)value; // Error 167 Cannot convert type 'T' to 'int' 
      int y = (int)(object)value; // works though boxing and unboxing 
     } 
    } 
} 

Anche se funziona attraverso la boxe e unboxing, si tratta di un sovraccarico delle prestazioni aggiuntive e Stavo vagando se c'è un modo per farlo direttamente.

+5

Quindi, fammi capire questo ... Stai costruendo un metodo che è generico, ma ha bisogno di sapere se il parametro type è un int? Il tuo design, c'è qualcosa di sbagliato in questo. – Will

+0

Qualsiasi motivo per non aggiungere un overload 'void DoSomething (valore int) {}'? –

+0

Questo è un esempio semplificato. Il codice effettivo ha un sacco di cose prima e dopo la conversione che beneficiano di generici –

risposta

15

Boxe e unboxing saranno il modo più efficiente qui, per essere onesti. Non conosco alcun modo per evitare il verificarsi della boxe e qualsiasi altra forma di conversione (ad esempio Convert.ToInt32) è potenzialmente in grado di eseguire conversioni che in realtà non si desidera.

+0

Grazie per aver confermato i miei pensieri su boxing/unboxing. Chiamare Converti sarebbe infatti più lento in quanto vi è un sovraccarico di chiamate oltre al boxing/unboxing che si verificherebbe comunque: Convert.ToInt32 (valore dell'oggetto) accetta l'oggetto in modo che T venga inserito in una casella a questo punto e quindi unbox in un momento successivo. –

2
Convert.ToInt32(value); 

Dovrebbe farlo.

1

int e le altre primitive CLR implementano IConvertible.

public class Test 
{ 
    void DoSomething<T>(T value) where T : IConvertible 
    { 
     var type = typeof(T); 
     if (type == typeof(int)) 
     { 
      int y = value.ToInt32(CultureInfo.CurrentUICulture); 
     } 
    } 
} 
1
int x = (dynamic)MyTest.Value; 

So che questo è un thread molto vecchio, ma questo è il modo effettivo per farlo. (dynamic) convertirà il valore T in qualsiasi tipo primitivo conosciuto in runtime.

0
int id = (dynamic)myobject.SingleOrDefault(); 

O

int id = (int)myobject.SingleOrDefault(); 

ha funzionato per me per ottenere il valore int. Qui myobject sta avendo il valore ObjectResult<Nullable<int>>.

0

Il seguente metodo dovrebbe funzionare.

int x = (int)(value as int?); 
Problemi correlati