c#: HttpRuntime.Cache produce una excepción de conversión no válida
Frecuentes
Visto 814 veces
-1
¿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?)
3 Respuestas
1
¿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
0
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
0
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 c# asp.net httpruntime.cache or haz tu propia pregunta.
Ni idea. probablemente usaría
as
y un cheque nulo sin embargo. - user166390