2010-05-19 10 views
11

estoy tratando de convertir el valor del valor t parámetro de tipo genérico en número entero después de asegurarse de que T es, de hecho entero:¿Cómo convertir el valor del argumento de tipo genérico a 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 
     } 
    } 
} 

pesar de que funciona a través del boxeo y unboxing, se trata de una sobrecarga de rendimiento adicional y Estaba vagando si hay una manera de hacerlo directamente.

+5

Entonces, permítanme entender esto ... Están construyendo un método que es genérico, pero necesita saber si el parámetro tipo es un int? Tu diseño, hay algo mal con eso. – Will

+0

Cualquier razón para no agregar una sobrecarga 'void DoSomething (int value) {}'? –

+0

Este es un ejemplo simplificado. El código real tiene muchas cosas antes y después de la conversión que se benefician de los genéricos –

Respuesta

15

El boxeo y el unboxing va a ser la forma más eficiente aquí, para ser honesto. No conozco ninguna forma de evitar que ocurra el boxeo, y cualquier otra forma de conversión (por ejemplo, Convert.ToInt32) posiblemente realizará conversiones que realmente no desea.

+0

Gracias por confirmar mis pensamientos sobre el boxeo/unboxing. Llamar a Convert sería mucho más lento ya que hay una sobrecarga adicional de llamadas así como el boxeo/unboxing que ocurriría de todos modos: Convert.ToInt32 (valor del objeto) toma el objeto para que T sea encasillado en este punto y luego desempaquetado en algún momento posterior. –

2
Convert.ToInt32(value); 

Debería hacerlo.

1

int y las otras primitivas CLR implementan 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; 

Sé que este es un hilo muy antiguo, pero esta es la forma real de hacerlo. (dynamic) convertirá el valor T en cualquiera de los tipos conocidos primitivos en tiempo de ejecución.

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

O

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

que trabajó para mí para obtener el valor int. Aquí myobject está teniendo valor de ObjectResult<Nullable<int>>.

0

De la siguiente manera debería funcionar.

int x = (int)(value as int?); 
Cuestiones relacionadas