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/41179199/

相关文章:

c# - 垃圾邮件发送者导致的 EndOfStreamException

c# - 我如何动态引用一个程序集来寻找另一个程序集?

c# - 如何首先修复数据库中的 'The model backing the context has changed since the database was created.'

c++ - 虚构造函数以及在其中调用虚函数会发生什么

java - 用 Java 转换惰性类?

kotlin - 编译错误 : Smart cast to '<type>' is impossible,,因为 '<variable>' 是一个局部变量,由变化的闭包捕获

c# - 将 Light Switch 与我自己的域对象一起使用

java - 在 init 之外的 java 中创建对象

Java API设计: narrow return type in methods

c# - 关于 C# 和继承