我为WinForm UserControl创建了一个通用基类:
public partial class BaseUserControl<T> : UserControl
{
public virtual void MyMethod<T>()
{
// some base stuff here
}
}
基于以下内容的UserControl:
public partial class MyControl : BaseUserControl<SomeClass>
{
public override void MyMethod<SomeClass>()
{
// some specific stuff here
base.MyMethod<SomeClass>();
}
}
它工作正常,但MyControl无法在VisualStudio Designer中编辑,因为它说它无法加载基类。 我试图定义另一个类BaseUserControl,非泛型,希望它会加载它,但这个技巧似乎不起作用。
我已经有了一个解决方法:定义一个接口,IMyInterface&lt; T&gt;,然后创建我的控件
public partial class MyControl : UserControl, IMyInterface<SomeClass>
但是我失去了我的基本虚拟方法(不是很重要,但仍然......)。
有没有办法为UserControl创建基础泛型类,有可能在VisualStudio Designer中编辑它?
答案 0 :(得分:35)
我们正在做同样的事情,我们首先通过专门化一个类并从专门的类派生出来。 使用示例中的代码,这意味着:
public partial class UserControl : UserControlDesignable
{
...
}
public class UserControlDesignable : BaseUserControl<Someclass> { }
设计师有时仍然表现得很脆弱 - 但大部分时间都有效。
答案 1 :(得分:14)
您必须通过添加继承自通用基本表单的“常规”类来欺骗设计人员。 然后,您的可设计表单应该继承自此类。 因此,以下2个类定义位于同一文件中。您必须确保从通用基本用户控件继承的类是文件中的最后一个类。
public MyForm : EditableCustomerForm
{}
public EditableCustomerForm : GenericForm<Customer>
{}
设计人员将在遇到的代码文件中显示第一个类。
答案 2 :(得分:3)
这似乎是Visual Studio中的一个错误。
通过挖掘框架(实际上通过添加RootDesignerSerializer
来自CodeDomSerializer
的自定义类型并覆盖serialize
方法),我能够证明VS Code Dom提供程序实际上是在解析泛型类错误,而不是将其视为泛型类,而是将其视为名为class<T>
的常规类,Type.GetType()
当然无法找到它。
我仍然在寻找解决方法,但同时可以使用上述解决方案。
有关于它的Microsoft.Connect错误报告,请在https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form
投票答案 3 :(得分:0)
Visual Studio版本&gt; = VS2015.1
从 VS2015.1 开始,Windows窗体设计器显示具有通用基类的类,没有任何问题。因此,VS的新版本不再需要其他帖子中的解决方法,并且设计器中将显示以下类,没有任何问题:
public class SomeClassControl:GenericControl<SomeClass>
{
}
较旧版本的Visual Studio
对于旧版本的Visual Studio,请使用其他帖子中描述的解决方法:
public class SomeClassControl:SomeClassControlBase
{
}
public class SomeClassControlBase:GenericControl<SomeClass>{}