我有一个基类
internal partial class View<T> : UserControl
where T : class
{
protected T t;
}
我想从View
派生一个孩子internal partial class ViewChild<T> : View<T>
where T : class
{
}
它运行正常,但我无法在VS设计器中编辑ViewChild。我知道问题是通用基类。但是我不明白在这种情况下我怎么能避免这种情况。 有没有办法解决这个问题?
答案 0 :(得分:3)
还有另一种方法,它不依赖于编译器标志:
http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/
我真的不建议使用条件编译。使用框架更好,而不是反对它。
基本上,您可以通过现有框架为VS提供不同的类。您使用TypeDescriptionProvider属性装饰您的基类,该属性告诉VS使用不同的类作为设计器。
正如原始博客文章中所提到的,可能存在与此变通方法相关的警告,但我在一个带有&gt;的项目上得到了整齐的工作。 25 UserControls继承自公共基类。
答案 1 :(得分:2)
泛型破坏了设计器,因为它无法在没有类型T
的情况下实例化该类。我在博文中解释了一个解决方法:
http://adamhouldsworth.blogspot.co.uk/2010/02/winforms-visual-inheritance-limitations.html
简而言之,您需要使用中间类“解析”类型:
BaseControl<T> : UserControl
CustomerControl_Design : BaseControl<Customer>
CustomerControl : CustomerControl_Design
然后,您可以根据DEBUG
或RELEASE
编译器开关有条件地将此类切换出代码:
#if DEBUG
namespace MyNamespace
{
using System;
public partial class CustomerEditorControl_Design : BaseEditorControl<Customer>
{
public CustomerEditorControl_Design()
: base()
{
InitializeComponent();
}
}
}
#endif
public partial class CustomerEditorControl
#if DEBUG
: CustomerEditorControl_Design
#else
: BaseEditorControl<Customer>
#endif
{
}
这将允许您打开CustomerControl
的派生类,遗憾的是, 从不 能够在签名中设计带有泛型的UI控件。我的解决方案只是启用派生项的设计。
我不知道为什么CustomerControl : BaseControl<Customer>
不起作用,因为在这种情况下定义了T
类型,但它根本没有 - 我猜是因为通用用法的规则。
为了他们的辩护,微软确实说这不受支持。