【发布时间】:2016-07-21 17:48:09
【问题描述】:
我有一个 WinForm-UserControl,它具有一个控件的泛型类型。为了创建实例,我更改了设计器代码:
public class TimeBarForm<T> : where T : TimeBarPanel
{
protected void InitializeComponent()
{
// ...
this.m_timeBarPanel = (T)Activator.CreateInstance(typeof(T));
// ...
}
}
这在编译时工作得很好,但在设计时它就坏了。在 TimeBarForm 上:
Failed to parse method 'InitializeComponent'. The parser reported the following error
'Type parameters are not suppported Parameter name: typeSymbol'.
Please look in the Task List for potential errors.
派生类只显示空用户控件的默认设计器。
我也尝试在构造函数中传递类型,但 VS 抱怨我不应该接触自动生成的代码(它不喜欢 if 条件)。我想要一个通用的 UserControl,我可以在其中决定派生类型中抽象类/控件的专门化,并且我仍然应该能够在基类中使用设计器。我愿意接受其他解决此问题的建议,因为这可能不是最佳解决方案。我不太习惯 UserControl 设计。
VS 2015/.Net 4.6
【问题讨论】:
-
一般来说,不要手动更改设计器生成的代码。如果设计师改变,它可能会破坏设计师或您的代码可能会被删除。设计师的工作基于解析和反序列化。如错误中所述,它无法反序列化代码。看看这个帖子Can't view designer when coding a form in C#。它包含有关设计师如何工作的有用信息。它还包含一个有趣的示例,可以帮助您了解设计师的工作原理。
-
您是否可以让您的基本控件
TimeBarPanel非抽象(因为设计师的目的)? -
在我当前的实现中它是非抽象的。但我必须以某种方式“注入”专业化。
标签: c# winforms visual-studio generics user-controls