我有一个基础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>
。
我该如何施展?
答案 0 :(得分:19)
您无法将Generic<Derived>
投射到Generic<Base>
。
想想你是否可以。您有List<Wolf>
并将其投放到List<Animal>
。现在,您可以.Add()
Sheep
到List<Animal>
。但是等等......现在您的List<Wolf>
包含Sheep
。真是一团糟。
如果你能确保你所投射的东西在所有可能的形式中都是只读的,那么这只会有用。这是co- and contravariance的全部内容。它只适用于接口。