【问题标题】:Abstract generic UserControl inheritance in Visual Studio designerVisual Studio 设计器中的抽象通用 UserControl 继承
【发布时间】:2016-11-10 18:42:47
【问题描述】:

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

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

我收到编译器错误

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

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

我不能从非泛型基类派生 MyBaseControl,因为它已经从泛型基类派生,所以我尝试用接口装饰它并像这样使用它:

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

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

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

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

【问题讨论】:

  • Arributes 与泛型的工作方式不同,因此为什么 [TypeDescriptionProvider(typeof 因为它不能使用泛型

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


【解决方案1】:

我想你有一个控件AbstractGenericBase&lt;T&gt; : GenericBase&lt;T&gt;,其中GenericBase&lt;T&gt; 是一个具有这样定义的控件:GenericBase&lt;T&gt;: UserControl

所以如果你想在设计器中显示AbstractGenericBase&lt;T&gt;,你可以使用这个代码:

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&lt;T&gt; : GenericBase&lt;T&gt;
  • 如果T 有一些类型约束,请使用满足通用约束的Dummy 代替GenericBase&lt;object&gt; 中的object
  • 解决方案基于以下事实:当设计者想要在设计图面上显示您的控件时,它会尝试创建控件的基类实例。当控件的基类是泛型类时,设计者不知道如何创建基类的实例。
    在上面的解决方案中,为了设计时支持,我们告诉设计者我们控件的基类是NonGenericBase,但是对于运行时,我们保留GenericBase&lt;T&gt;作为我们控件的基类。

【讨论】:

  • 目标是在设计器中展示这个类:public abstract partial class AbstractGenericBase&lt;T&gt; : GenericBase&lt;T&gt;。如果您的目标不同,请告诉我。
  • 谢谢,这行得通。我想补充一点,您必须为非泛型类指定一个不同于泛型的名称,或者将其保存在不同的文件中。否则你会得到错误The type '&lt;class name&gt;' is made of several partial classes in the same file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多