我有一个基本的WPF UserControl,它处理派生UserControl的一些常用功能。在任何派生的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>。
DataContext
BaseViewModel
BaseViewModel<Wire>
BaseViewModel<Connector>
我该如何投放?
您不能将强制Generic<Derived>转换为Generic<Base>。
Generic<Derived>
Generic<Base>
试想一下,如果可以。您有一个List<Wolf>并将其转换为List<Animal>。现在,你可以.Add()一个Sheep你List<Animal>。但请稍候…现在您的中List<Wolf>包含一个Sheep。真是一团糟。
List<Wolf>
List<Animal>
.Add()
Sheep
仅当您可以确保投射到的东西以所有可能的形式为只读时,这才可行。这就是协和,而协方差就是这样。但是,它仅适用于接口。