泛型类型在泛型约束中的应用

5
我希望能够指定类似以下内容:

```

public abstract class ColumnFilter<TCell, TFilterControl> : ColumnFilter
    where TFilterControl : FilterControl<>, new()
    where TCell : IView, new()
{
}

FilterControl<>类是一个基类。我无法知道FilterControl<>的泛型参数是什么。

3个回答

5

您不能在类型约束中使用未绑定的泛型类型。您需要添加第三个类型参数,例如:

public abstract class ColumnFilter<TCell, TFilterControl, TFilterControlType> : ColumnFilter
    where TFilterControl : FilterControl<TFilterControlType>, new()
    where TCell : IView, new()
{
}

或者创建一个非泛型的基类型FilterControl:
public FilterControl { }
public FilterControl<T> : FilterControl { }

public abstract class ColumnFilter<TCell, TFilterControl> : ColumnFilter
    where TFilterControl : FilterControl, new()
    where TCell : IView, new()
{
}

如果您希望强制消费者使用您的泛型派生类型,则可以通过使用 internal 构造函数使基础类型成为 abstract


我本来想这么做,但不太方便。似乎没有其他办法。 - b0bi

2

ColumnFilter必须告知该类型是什么。

添加第三个泛型类型参数,如下所示:

public abstract class ColumnFilter<TCell, TFilterControl, TFilter> : ColumnFilter
    where TFilterControl : FilterControl<TFilter>, new()
    where TCell : IView, new()
{
}

我本来想这么做,但不太方便。似乎没有其他办法。 - b0bi

0
问题在于你认为FilterControl<>是一个基类,但实际上它更像是一个模板。只有在给出<>内部内容的上下文后,它才具有实质意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接