设计模式下的C#type <to>用户控件给出了错误</t>

时间:2009-12-17 08:48:44

标签: c# generics user-controls types designmode

我有一个自定义类,它派生自UserControl。 代码:

public partial class Gallery<T> : UserControl where T : class, IElement, new()

这个类似它应该工作的类。但是,当我尝试进入包含这些Gallery类的表单的设计模式时,它会给我错误:

  
      
  • 找不到类型'PresentrBuilder.Forms.Gallery'。   请确保装配   包含此类型的引用。   如果这种类型是您的一部分   开发项目,确保   该项目已成功   建成。

  •   
  • 变量'pictureGallery'要么未声明,要么永远不会   分配

  •   

注意:(pictureGallery实际上是Gallery<PictureElement>)。

怎么能解决这个问题?这样,我无法在设计模式下工作,这使得创建我的用户界面非常困难。

4 个答案:

答案 0 :(得分:12)

设计师讨厌(即不支持)通用控件,并且不会很快改变,所以不要这样做。相反,考虑使用接受Type的属性(或类似),并在运行时做一些工作(反射等) - 或者:不要使用设计器。

例如,如果你有:

public Type ControlType {get;set;} // comparable to T in the original

您可以使用:

IElement el = (IElement) Activator.CreateInstance(ControlType);

这将为您提供当前拥有的所有内容(newIElement等) - 但它无法在编译时进行任何验证。

答案 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)

让控件与一个独立于控件本身的泛型类交互,而不是使用泛型控件。然后将此类传递给控件。