Visual Studio Designer 可以显示继承泛型类型的类吗?

Posted

技术标签:

【中文标题】Visual Studio Designer 可以显示继承泛型类型的类吗?【英文标题】:Can visual studio designer show classes inheriting generic types? 【发布时间】:2011-10-16 04:10:15 【问题描述】:

我正在尝试清理我们解决方案中的所有设计器错误并遇到以下错误:

无法显示此文件的设计器,因为其中没有任何类可以设计。设计器检查了文件中的以下类: DoubleAttributeTextBoxBase --- 无法加载基类“NumericAttributeTextBoxBase”。确保程序集已被引用并且所有项目都已构建。

这两个类都定义在同一个程序集中,所以我知道这不是参考问题。我想知道它是否与基类是通用的事实有关。有什么想法吗?

public class DoubleAttributeTextBoxBase : NumericAttributeTextBoxBase<double>

public class NumericAttributeTextBoxBase<T> : TextBox where T : IComparable, IComparable<T>

【问题讨论】:

我知道这可能看起来很愚蠢,但您是否检查过它们是否在同一个命名空间中?应用程序是否编译? 【参考方案1】:

正在设计的类的基类必须是非抽象和非泛型的。使从泛型类继承的类可设计。解决方法是在中间插入一个普通的非泛型类:

public partial class DoubleAttributeTextBoxBase
    : NumericAttributeTextBoxBaseOfDouble

    public DoubleAttributeTextBoxBase()
    
        InitializeComponent();
    

    // Now DoubleAttributeTextBoxBase is designable.


public class NumericAttributeTextBoxBaseOfDouble
    : NumericAttributeTextBoxBase<double>


为了尽可能简单,您甚至可以将非泛型类与您要设计的类放在同一个文件中。只需确保将其放在类之后(就像我在上面所做的那样),因为设计者希望文件中的第一个类是正在设计的类。

【讨论】:

非泛型基类需要有无参数构造函数,没有它对我不起作用。引入构造函数后需要重建。【参考方案2】:

我不知道有什么解决方案,自从 C# 2.0 出来以来,这一直是 Visual Studio 的一个严重限制。我唯一能说的就是在运行时将该控件添加到页面,然后至少你可以让你的设计器回来做其他所有事情。

来自msdn:

您的组件或控件不能是泛型类型,也称为模板类型或参数化类型。设计环境不支持泛型。

http://msdn.microsoft.com/en-us/library/ms171843.aspx

【讨论】:

以上是关于Visual Studio Designer 可以显示继承泛型类型的类吗?的主要内容,如果未能解决你的问题,请参考以下文章

为什么在Visual Studio编码的UI测试中编辑UIMap.designer.cs文件不好?

在Visual Studio Designer中找不到自定义字体的C#文件

c# Using Settings under visual studio 2012

尝试在Visual Studio 2017中查看“应用程序属性”页面时出现NotImplementedException

为啥 Visual Studio 会自动更改我的表单布局?

Visual Studio 项目:缺少 Properties/Settings.settings