c# wpf oop casting covariance

c# - Transmitir<Derived> genérico a<Base> genérico



wpf oop (1)

No puede emitir un Generic<Derived> Generic<Base> a un Generic<Base> .

Solo imagina si pudieras. Tiene una List<Wolf> y la convierte en una List<Animal> . Ahora podría .Add() una Sheep a su List<Animal> . Pero espera ... ahora tu List<Wolf> contiene una Sheep . Que desastre.

Esto solo funcionaría si pudieras asegurarte de que lo que emites sea de solo lectura en todas las formas posibles. Esto es msdn.microsoft.com/en-US/library/dd799517(v=vs.110).aspx se trata. Sin embargo, solo funciona para interfaces.

Tengo un WPF UserControl base que maneja algunas funciones comunes para los UserControls derivados. En el código subyacente de cualquier UserControl derivado, llamo un evento

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

En mi base UserControl hago

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

Esto arroja una InvalidCastException ya que DataContext es de tipo BaseViewModel pero de un tipo derivado como BaseViewModel<Wire> o BaseViewModel<Connector> .

¿Cómo puedo lanzar eso?