我有一个自定义类,它派生自UserControl
。
代码:
public partial class Gallery<T> : UserControl where T : class, IElement, new()
这个类似它应该工作的类。但是,当我尝试进入包含这些Gallery
类的表单的设计模式时,它会给我错误:
找不到类型'PresentrBuilder.Forms.Gallery'。 请确保装配 包含此类型的引用。 如果这种类型是您的一部分 开发项目,确保 该项目已成功 建成。
变量'pictureGallery'要么未声明,要么永远不会 分配
注意:(pictureGallery
实际上是Gallery<PictureElement>
)。
怎么能解决这个问题?这样,我无法在设计模式下工作,这使得创建我的用户界面非常困难。
答案 0 :(得分:12)
设计师讨厌(即不支持)通用控件,并且不会很快改变,所以不要这样做。相反,考虑使用接受Type
的属性(或类似),并在运行时做一些工作(反射等) - 或者:不要使用设计器。
例如,如果你有:
public Type ControlType {get;set;} // comparable to T in the original
您可以使用:
IElement el = (IElement) Activator.CreateInstance(ControlType);
这将为您提供当前拥有的所有内容(new
,IElement
等) - 但它无法在编译时进行任何验证。
答案 1 :(得分:11)
有时在这种情况下最简单的做法是创建一个限定泛型参数的空子类。
通常使用ObservableCollection:
public class SomeItemCollection : ObservableCollection<SomeItem>{
}
这有点刺激,但它可以解决你的问题。
答案 2 :(得分:3)
与其他人所说的一样,Visual Studio Designer在控件中处理泛型有很多麻烦。在尝试实现像通用“属性查看器”类这样的东西时,我自己就遇到了这个问题。
对我有用的解决方案是定义一个中间阶层,就像Egor所说的那样。如果我理解你的问题,对于你的情况,那应该是这样的:
public class PictureElementGallery : Gallery<PictureElement>
然后在表单上使用 PictureElementGallery ,而不是 Gallery&lt; PictureElement&gt; 。 设计师应该没有问题。
答案 3 :(得分:1)
让控件与一个独立于控件本身的泛型类交互,而不是使用泛型控件。然后将此类传递给控件。