0

我的代码中有很多字典绑定。它们中的大多数都没有找到并使用 FallBackValue。

这对用户来说都非常有用。

但是,当我在调试器中运行它时,需要很长时间才能在输出窗口中显示所有这些错误。

我问了这个问题WPF Dictionary Binding failure is very slow并被告知我应该返回 DependencyProperty.UnsetValue。

我已经尝试过了,它可以编译。但是当我运行它时,我得到了一个例外。

有没有办法定义一个也可以返回 DependencyProperty.UnsetValue 的字典? (或其他更快失败的方法。)

更新:这是我尝试过的迭代:

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);
        }
    }        
}
4

1 回答 1

1

UnsetValue具有 Object 的运行时类型,因此对于任何其他 TValue 类型,errorResult 将为 null,并且default(TValue)也是 null。因此,最后,您通常会在缺少键时返回 null,而不是抛出适当的异常。这与 IDictionary 合同相违背,这就是为什么事情不成功的原因。从本质上讲,您的类看起来像一个真正的 IDictionary(即它实现了 IDictionary),但它并不是真正的一个(即它的行为不像一个)。你没有说你在运行时得到了什么异常,但我认为它是来自客户端代码的 NullReferenceException,它不期望你的方法调用返回 null。

您实际上是在尝试dict[key]dict.TryGetValue(key)现有代码一样重写。我可以同情这些动机,但这行不通。它必须从调用方修复,听起来你无法控制它。

于 2013-02-20T01:35:04.393 回答