2017-06-01 90 views
1

每次我写一个值转换器我想知道如何处理在ConvertConvertBack方法IValueConverter的规定targetType参数的目标类型参数:我应该使用的IValueConverter

object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 

我注意到许多实现使用targetType简单地通过检查它(if (targetType == typeof(RequiredType)))和投掷一些例外或返回空值,如果类型不喜欢预期:

但也有很多人(我认为这是大多数)是完全无视参数:

我试图找到一些指导或使用参数的提示,但不幸的是我什么都没发现。 两种方法都在做他们的工作,但更正确的方法之一?这些方法的优点和缺点是什么?我应该忽略还是使用参数?

我个人的观点并不是检查参数,以允许转换器的使用更灵活,但我很高兴得到您的意见。

+0

该参数的意义在于调用者将告诉你要将其转换为什么;如果你总是忽略它们并返回相同的结果,那么与检查并抛出异常相比,它不会更“灵活”。同样,如果他们只是要求你要回来的东西,那又如此:它实际上并不是更灵活。在大多数情况下,你只能转换成一件事,所以它很少是真正的问题,因此很多代码忽略它。 –

回答

0

呼叫者会告诉你什么是理想的类型转换值:

  1. 如果你知道你总是会转换成一种类型,例如true/falseVisibility,那么你可以忽略targetType。很明显,如何使用转换器,不需要抛出异常。
  2. 基于targetType转换该值,例如,使用转换器转换为ImageSourceBrush。在第一种情况下,您希望生成图像(例如错误图像),而另一种情况下需要简单的颜色(例如红色)。
  3. 如果您知道某人可能会将您的转换器与targetType一起使用,那么您不希望这样做,并且支持与否也不明显,那么您可以通过抛出异常来警告开发人员。

我认为最常见的情况是1)。