c# - 将 Generic<Derived> 转换为 Generic<Base>

标签 c# oop casting covariance

<分区>

我有一个基本的 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;
       ...
   }
}

这会抛出一个 InvalidCastExceptionDataContext类型为 BaseViewModel但是像 BaseViewModel<Wire> 这样的派生类型或 BaseViewModel<Connector> .

我该如何转换它?

最佳答案

你不能转换 Generic<Derived>Generic<Base> .

试想一下,如果可以的话。你有一个 List<Wolf>并将其转换为 List<Animal> .现在你可以 .Add()一个Sheep给你的List<Animal> .但是等等......现在你的List<Wolf>包含 Sheep .真是一团糟。

只有当您可以确保您转换到的对象在所有可能的形式下都是只读的时,这才会奏效。这是 co- and contravariance是关于。不过,它仅适用于接口(interface)。

关于c# - 将 Generic<Derived> 转换为 Generic<Base>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52006463/

相关文章:

c# - 如果我将我的数组、集合、列表、可枚举项等命名为它们所包含内容的复数形式,会不会有不好的事情发生在我身上?

javascript constructor.prototype继承另一个constructor.prototype

c++ - 如何设计一个具有相似功能但不同签名的方法的类

c# - 将通用类型对象转换为子类型

c# - 为什么在 C# 中使用 -3==~2

c# - 从 Powershell 调用带有 Expression<Func> 参数的 C# 方法

c# 将行添加到数据网格组合框

java - 如何调用另一个类的方法?

c++ - 转换为具有相同基数 : 的类

swift - Any 中的 Swift 转换失败?协议(protocol)