2013-02-19 2 views
0

을 반환 할 수 있습니다. 대부분은 발견되지 않고 FallBackValue를 사용합니다.사전 내 코드에서 꽤 많은 사전 바인딩이 DependencyProperty.UnsetValue

이 모든 기능을 사용자에게 큰가. 내가 디버거에서 실행할 때

그러나, 그것은 출력 창에서 모든 오류를 표시하는 데 시간이 오래 걸립니다.

나는이 질문 WPF Dictionary Binding failure is very slow 물어 내가 DependencyProperty.UnsetValue 반환해야 함을 들었다.

나는 것을 시도하고, 그것을 컴파일합니다. 그러나 그것을 실행할 때 예외가 생깁니다.

도 DependencyProperty.UnsetValue를 반환 할 수있는 사전을 정의하는 방법은 없나요? (또는 다른 방법으로 빨리 실패합니다.)

UPDATE를 : errorResult 다른 경우는 null이 될 것입니다, 그래서

public class NullTolerantDictionary<TKey, TValue> 
      : Dictionary<TKey, TValue> where TValue : class 
{ 
    public new TValue this[TKey key] 
    { 
     get 
     { 
      TValue value; 
      bool success = TryGetValue(key, out value); 
      if (success) 
       return value; 

      var errorResult = DependencyProperty.UnsetValue as TValue; 

      if (errorResult != null) 
       return errorResult; 

      return default(TValue); 
     } 
    }   
} 

답변

1

UnsetValue이 Object의 실행시의 형태를 가지고 : 여기에 내가 뭘하려 반복이다 TValue 유형 및 default(TValue)도 null입니다. 그래서 결국 적절한 예외를 던지기보다는 키가 누락되면 null을 리턴합니다. 이것은 IDictionary 계약과 상반되는 것인데, 이는 일이 잘 풀리지 않는 이유입니다. 본질적으로 클래스는 실제 IDictionary처럼 보이지만 (IDictionary를 구현합니다.) 실제로는 하나가 아닙니다 (즉, IDictionary처럼 작동하지 않습니다). 런타임에 어떤 예외가 발생하는지는 말하지 않지만 null을 반환하는 메서드 호출을 기대하지 않는 클라이언트 코드에서 NullReferenceException이라고 가정합니다.

당신은 본질적으로 기존 코드에 dict.TryGetValue(key)dict[key]를 다시 작성하려고합니다. 동기에 공감할 수는 있지만 작동하지 않습니다. 호출 측에서는 고정되어 있어야하며, 제어 할 권한이없는 것처럼 들립니다.