将Generic <derived>转换为Generic <base />

时间:2016-12-16 07:21:02

标签: c# wpf oop casting covariance

我有一个基础WPF UserControl,它处理派生UserControls的一些常用功能。在任何派生的UserControl的代码隐藏中,我调用一个事件

private void SomeClick(object sender, RoutedEventArgs e) {
    HandleClick(sender);
    MyDataGrid.Items.Refresh();
}

在我的基本UserControl中,我做

public class BaseUserControl : UserControl {
   protected void HandleClick(object sender) {
       var vm = (BaseViewModel<Part>)DataContext;
       ...
   }
}

这会抛出 InvalidCastException ,因为DataContext的类型为BaseViewModel,但类型为BaseViewModel<Wire>BaseViewModel<Connector>

我该如何施展?

1 个答案:

答案 0 :(得分:19)

您无法将Generic<Derived>投射到Generic<Base>

想想你是否可以。您有List<Wolf>并将其投放到List<Animal>。现在,您可以.Add() SheepList<Animal>。但是等等......现在您的List<Wolf>包含Sheep。真是一团糟。

如果你能确保你所投射的东西在所有可能的形式中都是只读的,那么这只会有用。这是co- and contravariance的全部内容。它只适用于接口。