2011-08-15 23 views
6

así que tengo una clase genérica (que es sobre todo una clase de contenedor) con la conversión implícita, así:Ejecutar conversión implícita en tiempo de ejecución

public class Container<T> 
{ 
     public T Value { get; set; } 

     public static implicit operator T(Container<T> t) 
     { 
      return t.Value; 
     } 

     public static implicit operator Container<T>(T t) 
     { 
      return new Container<T>() { Value = t }; 
     } 
} 

Así que en tiempo de ejecución me gustaría correr una instancia de Container<int> a int usando reflexión, pero parece que no puede encontrar la manera, he intentado invocar el método "Cast" mencionado en un par de lugares pero obtengo una excepción de Specified cast is not valid..

Cualquier ayuda será apreciada.

+1

Entonces, ¿Cómo sabe en tiempo de compilación y lo que sabes en ¿Tiempo de ejecución? ¿Podría darnos el código de llamada? –

+0

¿Está tratando de "lanzar" el contenedor a int, o Container.Value? –

+1

¿Por qué no llamas a 'Container.Value'? – jason

Respuesta

4

Casi nunca hay una buena razón para hacer esto a menos que el tipo en cuestión sea interno para un ensamblaje que no puede modificar.

Pero si se tratara de eso, yo personalmente preferiría la solución de apariencia más limpia dynamic (como lo menciona jbtule) a la reflexión.

Pero desde que solicitó una solución con la reflexión (tal vez usted está en .NET 3.5 o anterior?), Que puede hacer:

object obj = new Container<int>(); 

var type = obj.GetType(); 
var conversionMethod = type.GetMethod("op_Implicit", new[] { type }); 
int value = (int)conversionMethod.Invoke(null, new[] { obj }); 
+0

Gracias, intentaremos esto –

1

Al usar el dlr, accesible por el código abierto ImpromptuInterface en nuget, puede dinámicamente call an implicit or explicit cast.

int intInstance =Impromptu.InvokeConvert(containerInstance, typeof(int)); 

Aunque este ejemplo es bastante trivial y se puede lograr a través de

int intInstance = (dynamic) containerInstnace; 

también. pero si no sabe int en tiempo de compilación, Impromptu es el camino a seguir.

+0

Gracias, investigaré –

0

Escribir operadores implícitos le permite hacer las versiones implícitamente. En otras palabras, esto es perfectamente legal:

int i = new Container<int>() { Value = 2 }; 
if (i == 2) 
{ 
    // This will be executed 
} 

Si sólo tiene un Container<object> entonces que no va a funcionar, pero en ese caso el código probablemente debería ser rediseñado de todos modos, ya que estás ignorando esencialmente el parámetro genérico tienes.

+0

No estoy seguro de que entiendo lo que dice aquí ... –

Cuestiones relacionadas