2012-05-22 5 views
-1

다음은 어떻게 "잘못된 캐스트 예외"를 생성 할 수 있습니까 ??? 내가이 일을하려는 이유를 묻는 사람들에게 C# : HttpRuntime.Cache가 잘못된 캐스트 예외를 생성합니다.

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

(

:. 나는 무작위로 테스트 이런 종류의 필요성 때문에 캐시에/몇 가지 다른 개체를 추가 및 제거 나는 어떤 종류를 만들 계획이었다 내 다양한 ​​개체를 보유 할 컨테이너 개체의, 나는 캐시 에서이 개체를 밀어 것이지만 질문은 남아있다 : ​​캐스팅 예외를 해결할 것인가?)

+2

아무 생각 : 작동하는 코드에 대한

그리고 지금. 나는 아마도'as'와 null-check를 사용할 것입니다. –

답변

0

확인 마침내 그것을했다.

우선, 내 사과, 내가 실수로 내 로그 파일을 읽었습니다. 예외는 형태에게

MyClass mc = (MyClass)entry.Value; 

오지 않았지만

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

에서 캐시가 KeyValuePair (코드 내가 ... 인터넷에서 발견했다)에 반복 할 수없는 나타납니다. 다시 한 번 잘못된 방향으로 시간을 낭비해서 죄송합니다 ... 어쨌든 도와 주셔서 감사합니다!

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

동적 (재 컴파일) 환경에 있습니까? 예를 들어 ASP.NET 웹 사이트는 코드 파일이 변경되면 런타임에 페이지를 다시 컴파일합니다. 해당 페이지를 어셈블리로 컴파일하고 해당 어셈블리를로드합니다. 런타임이 어느 시점에서 이전 어셈블리를 언로드하더라도 여전히 이전 어셈블리와 호환되지 않는 새로운 유형을 제공합니다.

버전 관리 또는 강력한 명명과 함께이 문제를 해결할 수 있다면 잘 모르겠습니다. 하지만 변경이 발생했기 때문에 이전 유형을 원할 것 같지 않습니다.

0

코드가 실패 왜 생각,하지만 당신은 'softcast'로이 시도 할 수 있습니다 :

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

또한 entry.Value가 현재 캐치되지 않은 null 인 경우에도 작동합니다. –

+0

값이 null이면 원래 코드의 entry.Value.GetType()에서 널 포인터 예외가 발생했을 것입니다. – Peter

+0

그게 무슨 뜻인지, 예외는 잡히지 않았어, 어디에서 코드가 그 유스 케이스를 다루는 지. –

관련 문제