Visual Studio设计器中的抽象通用UserControlinheritance

在我的一个项目中,我正在使用抽象的UserControl。 为了能够在Visual Studio中设计此控件,我使用了本答案中提出的代码。 现在我想使用另一个抽象的UserControl,它也是通用的。 但如果我这样做

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<MyBaseControl, UserControl>))] 

我收到了编译器错误

CS0416:属性参数不能使用类型参数

删除类型参数显然也无法编译。

我无法从非generics基类派生MyBaseControl,因为它已经从通用基类派生,所以我尝试使用接口进行装饰并使用它如下:

 [TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider))] 

确实编译但是当我打开设计视图时,我的控件不会被渲染,而是我得到了错误

提供的generics参数的数量不等于generics类型定义的arity。

有办法解决这个问题吗?

我想你有一个控件AbstractGenericBase : GenericBaseGenericBase是一个具有这样定义的控件: GenericBase: UserControl

因此,如果要在设计器中显示AbstractGenericBase ,可以使用以下代码:

 using System.ComponentModel; using System.Windows.Forms; #if DEBUG public abstract partial class AbstractGenericBase : NonGenericBase #else public partial class AbstractGenericBase : GenericBase #endif { public AbstractGenericBase() { InitializeComponent(); } } #if DEBUG public class NonGenericBase : GenericBase { } #endif 

注意

  • 目标是在设计师中展示这个类:
    public abstract partial class AbstractGenericBase : GenericBase
  • 如果T有一些类型约束,而不是GenericBaseobject ,请使用满足generics约束的Dummy
  • 解决方案基于以下事实:当设计人员想要在设计图面中显示您的控件时,它会尝试创建控件的基类实例。 当控件的基类是generics类时,设计器不知道如何创建基类实例。
    在上面的解决方案中,对于设计时支持,我们告诉设计者我们控件的基础是NonGenericBase ,但是对于运行时,我们将GenericBase保持为我们控件的基类。