首頁 >後端開發 >C++ >如何在WPF中安全地將通用施加給通用?

如何在WPF中安全地將通用施加給通用?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-28 18:41:09898瀏覽

How to Safely Cast Generic to Generic in WPF?

在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中不允許這樣做。

替代方案

為了解決這個問題,可以考慮以下替代方案:

  • 使用接口而不是泛型來定義DataContext必須實現的契約。
  • 使用協變或逆變接口來強制對泛型類型的只讀訪問。
  • 通過泛型實現繼承,派生類繼承自基類並實現其自身特定的功能。

以上是如何在WPF中安全地將通用施加給通用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn