c#: HttpRuntime.Cache produce una excepción de conversión no válida

¿Cómo puede lo siguiente producir una "excepción de conversión no válida"?

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)
{
    if (entry.Value.GetType() == typeof(MyClass))
    {
        MyClass mc = (MyClass)entry.Value; // ===> Invalid Cast Exception !!!

(Para aquellos que preguntan por qué quiero hacer esto: agrego y elimino aleatoriamente algunos objetos diferentes en/del caché, por lo que es necesario realizar este tipo de prueba. Estaba planeando crear algún tipo de objeto contenedor que mantuviera mi varios objetos; empujaría solo este objeto en el caché, pero la pregunta sigue siendo: ¿resolvería la excepción de conversión?)

preguntado el 22 de mayo de 12 a las 09:05

Ni idea. probablemente usaría as y un cheque nulo sin embargo. -

3 Respuestas

¿Estás en un entorno que realiza una (re)compilación dinámica? Los sitios web ASP.NET, por ejemplo, vuelven a compilar las páginas en tiempo de ejecución si el archivo de código cambia. Ellos compilarán esa página en un ensamblado y cargarán ese ensamblado. Incluso si el tiempo de ejecución descarga el ensamblado anterior en algún momento, esto aún le brinda un nuevo tipo que no es compatible con el anterior.

No sé, si puede solucionar esto con algún tipo de control de versiones o nombres fuertes. Pero dado que ocurrió el cambio, parece poco probable, querrías el tipo antiguo.

contestado el 22 de mayo de 12 a las 10:05

No tengo idea de por qué falla su código, pero puede intentarlo con un 'softcast':

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache) 
{ 
     MyClass mc = entry.Value as MyClass;
     if (mc != null)     
     {         
          //Do your stuff

contestado el 22 de mayo de 12 a las 10:05

eso también funcionaría si entry.Value fuera nulo, lo que actualmente no se detecta. - Simón Halsey

Si el valor es nulo, debería haber una excepción de puntero nulo en la entrada.Valor.GetType() en el código original. - Peter

Eso es lo que quiero decir, la excepción no se detecta, ya que su código se ocupa de ese caso de uso. - Simón Halsey

Bien, finalmente lo logré.

En primer lugar, mis disculpas, estaba leyendo erróneamente mi archivo de registro. La excepción no vino de forma

MyClass mc = (MyClass)entry.Value;

Pero de donde

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)

Parece que el caché no se puede iterar con un KeyValuePair (un código que encontré en Internet...). Una vez más, lo siento por perder el tiempo buscando en una dirección equivocada... ¡Gracias por tu ayuda de todos modos!

Y ahora para el código que funciona:

IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
    while (CacheEnum.MoveNext()) {
        MyClass mc = ((DictionaryEntry)CacheEnum.Current).Value as MyClass;
        if (mc != null) {
            // Doing stuff...

contestado el 22 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.