我正在努力拥有一个基地Windows 窗体 http://en.wikipedia.org/wiki/Windows_Formsform 包含通用功能和控件 - 但也包含对其方法需要类型的类的引用。每种形式都代表不同的类型,所以我认为我可以按照以下方式做一些事情:
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
{
}
}
我的设计师类声明也反映了我的表单的内容。现在,当我做代表类型的第二种形式时Foo
,我无法访问设计器,因为我收到此错误:
无法显示该文件的设计者,因为没有
可以设计其中的类。设计师考察了
文件中包含以下类: Foo --- 基类
无法加载“WindowsFormsApplication1.Base”。确保
程序集已被引用并且所有项目均已构建。
FooClass --- 基类 'WindowsFormsApplication1.BaseClass'
无法设计。
public partial class Foo : Base<FooClass>
{
public Foo()
{
InitializeComponent();
}
}
public class FooClass : BaseClass { }
为什么会发生这种情况/我做错了什么或者有其他方法可以做到这一点?
当 Windows 窗体或用户 UserControl 加载到设计器中时,基本上设计器正在创建一个实例基类(您的自定义表单或控件直接派生自该类),然后执行InitializeComponents()
通过反射手动/显式方法来构建控件的预期设计。
然而,在您的情况下,它无法创建基类的实例,因为它有一个通用参数。如果窗体或控件的基类是抽象的或没有默认构造函数,也会发生同样的情况。在这些情况下,设计者也将无法创建基类的实例。
有解决方法 http://www.pocketsilicon.com/post/Using-Visual-Studio-Whidbey-to-Design-Abstract-Forms为此,使用类型描述提供者属性 http://msdn.microsoft.com/en-us/library/system.componentmodel.typedescriptionproviderattribute.aspx您可以在其中为设计器提供一个应该实例化的替换类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)