Luk*_*ley 9 c# inheritance winforms
我想尝试一个基本的Windows窗体表单,其中包含常见的功能和控件 - 但也包含对类需要一个类型的类的引用.每个表单都代表不同的类型,所以我认为我可以按照以下方式做一些事情:
public partial class Base<T> : Form where T : BaseClass
{
private GenericHandler handler = new GenericHandler();
}
public class BaseClass { }
public class GenericHandler
{
public void DoSomethingWithInstance<T>(T instance) where T : BaseClass
{
}
}
Run Code Online (Sandbox Code Playgroud)
我的设计师类声明也反映了我的表单.现在当我做第二个表示类型的表单时Foo,我无法访问设计器,因为我收到此错误:
无法为此文件显示设计器,因为其中的所有类都无法设计.设计者检查了文件中的以下类:Foo ---无法加载基类"WindowsFormsApplication1.Base".确保已引用程序集并且已构建所有项目.
FooClass ---无法设计基类'WindowsFormsApplication1.BaseClass'.
public partial class Foo : Base<FooClass>
{
public Foo()
{
InitializeComponent();
}
}
public class FooClass : BaseClass { }
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况/我做错了什么或有其他方法可以做到这一点?
bit*_*onk 15
当在设计器中加载Windows窗体或用户UserControl时,设计器基本上是创建基类的实例(自定义窗体或控件直接派生自的类),然后InitializeComponents()通过反射手动/显式执行该方法来构建你控制的预期设计.
但是,在您的情况下,它无法创建基类的实例,因为它具有通用参数.如果表单或控件的基类是抽象的或没有默认构造函数,则会发生同样的情况.在这些情况下,设计人员也无法创建基类的实例.
使用TypeDescriptionProviderAttribute有一个解决方法,您可以为设计器提供一个替代类,它应该实例化.
| 归档时间: |
|
| 查看次数: |
5333 次 |
| 最近记录: |