在WPF中安全地将泛型转换为泛型的技巧
在WPF中,创建提供派生用户控件共享功能的基用户控件是很常见的做法。为了确保从派生实例访问此功能,事件通常在派生用户控件的代码隐藏中调用,例如:
<code class="language-csharp">private void SomeClick(object sender, RoutedEventArgs e) { HandleClick(sender); MyDataGrid.Items.Refresh(); }</code>
但是,基用户控件的HandleClick方法可能需要特定的类型参数:
<code class="language-csharp">public class BaseUserControl : UserControl { protected void HandleClick(object sender) { var vm = (BaseViewModel<零件>)DataContext; ... } }</code>
如果派生用户控件中的DataContext是派生类型,例如BaseViewModel<导线>,则会发生InvalidCastException异常。这是因为DataContext不能直接转换为BaseViewModel<零件>。
为什么不能将Generic<派生>转换为Generic<基>?
禁止将Generic<派生>转换为Generic<基>,因为它可能导致不一致。想象一下,将List<狼>转换为List<动物>。然后,您可能将Sheep对象添加到List<动物>中,尽管在原始List<狼>中不允许这样做。
替代方案
为了解决这个问题,可以考虑以下替代方案:
以上是如何在WPF中安全地将通用施加给通用?的详细内容。更多信息请关注PHP中文网其他相关文章!