注册依赖属性时,可以使用接受验证回调的重载。Register
如果该验证回调返回false
一个值,则将该值分配给依赖属性将失败并ArgumentException
抛出 an ,抱怨无效的属性值。
现在,虽然ArgumentException
在某些情况下是合适的类型,但在某些情况下应该使用一些特殊的异常类型。特别是,我声明了一个enum
类型的属性,处理不受支持的值的正确方法是抛出一个InvalidEnumArgumentException
. 更重要的是,我正在实现一个接口,该接口将该enum
属性显示为 CLR 属性,并且在该属性的文档注释中,需要InvalidEnumArgumentException
为无效值抛出一个。
我看到的三个解决方案是:
- 更改接口文档以允许更通用的异常类型。这是不整洁的,我认为作为“解决方案”是不可接受的,因为它违背了拥有和记录专门的异常类型的目的。否则,我也可以
Exception
在我的文档中的任何地方写,让 API 用户来猜测和/或尝试实际抛出哪个。 false
从使用依赖属性注册的验证值回调返回(因此在通过更改ArgumentException
属性值时会导致SetValue
一个它们自己的逻辑,而不是调用/ 。让依赖属性本身的行为与通过其 CLR 属性设置器访问它时的行为不同似乎不一致。InvalidEnumArgumentException
GetValue
SetValue
- 在验证值回调中抛出一个
InvalidEnumArgumentException
而不是返回false
。这是我现在使用的解决方案。
我已经尝试了第三种解决方案,它似乎有效。唯一的缺点可能是丢失了默认的异常消息,但这似乎是较小的邪恶。
我的问题是:像这样从验证值回调中抛出是否有任何我不知道的副作用,并且会让我(或者更确切地说,我的代码)陷入困境?