Visual Studio设计器中的抽象通用UserControl继承

时间:2016-07-08 08:49:58

标签: c# winforms visual-studio windows-forms-designer designer

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

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

我收到编译错误

  

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

删除类型参数显然不会编译。

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

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

这个 编译但是当我打开设计视图时我的控件没有被渲染,而是我得到了错误

  

提供的通用参数的数量不等于泛型类型定义的arity。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

因此,如果您想在设计器中显示AbstractGenericBase<T>,可以使用以下代码:

using System.ComponentModel;
using System.Windows.Forms;

#if DEBUG
public abstract partial class AbstractGenericBase<T> : NonGenericBase
#else
public partial class AbstractGenericBase<T> : GenericBase<T>
#endif
{
    public AbstractGenericBase()
    {
        InitializeComponent();
    }
}
#if DEBUG
public class NonGenericBase : GenericBase<object> { }
#endif

注意

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