C# 泛型会中断继承

本文关键字:继承 中断 泛型 | 更新日期: 2023-09-27 18:33:54

希望这是一个快速的问题。我有一个继承自窗口(WPF)的C#类。我想将其视为模态对话框,并尝试使对话框接受泛型类型。代码如下:

public partial class PickingOptionsDialog<T> : Window
{
    private T _SelectedOption;
    public PickingOptionsDialog(ECartState State, String Bin)
    {
        InitializeComponent();
        DataContext = new OptionsViewModel(State, Bin);
    }
    public PickingOptionsDialog()
    {
        InitializeComponent();
        DataContext = new OptionsViewModel(ECartState.Picking, "1");
    }
    public T SelectedOption
    {
        get { return _SelectedOption; }
    }
}

使用此代码,我收到一个编译时错误,指出当前上下文中不存在 InitializeComponent()。为什么要这样做?

除了这个问题之外,我还想使允许的泛型类型必须是 Enum。在java中(如果Enum是一种类型),我可以像< T extends Enum >一样做到这一点。如何在 C# 中完成此操作?

C# 泛型会中断继承

要回答您的第一个问题:您必须将 type 参数添加到类的所有部分。在 WPF 情况下,这意味着您必须将其添加到 .xaml 中(因为从中生成InitializeComponent()的实现)。不幸的是,您无法在 xaml 中声明模板参数(至少我不知道如何声明)。因此,简单的答案似乎是:使用 WPF 无法做到这一点。

对于第二个问题:您可以使用"where"子句,如

public class C<T> where T : struct
{
}

但是,您只能将 T 限制为值类型(或某些接口),而不能显式限制为枚举。