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

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

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

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

public class DoubleAttributeTextBoxBase : NumericAttributeTextBoxBase<double>

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

【问题讨论】:

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

标签: c# visual-studio-designer


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 2010-10-22
    • 1970-01-01
    • 2018-09-27
    • 2015-09-15
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多