在设计模式下,C# 带有 <T> 的用户控件出现错误。

7

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

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

这个类的功能正常。但是,当我尝试进入包含这些Gallery类的表单的设计模式时,会出现错误:
  • 找不到类型“PresentrBuilder.Forms.Gallery”。 请确保包含此类型的程序集已被引用。 如果此类型是您开发项目的一部分,请确保 项目已成功构建。

  • 变量“pictureGallery”未声明或从未被赋值。

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

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

4个回答

12
设计师不喜欢(即不支持)通用控件,这种情况短期内不会改变,所以请不要这样做。相反,考虑拥有一个接受“Type”(类型)的属性(或类似的东西),并在运行时进行一些工作(反射等)-或者:不使用设计师。
例如,如果您有:
public Type ControlType {get;set;} // comparable to T in the original

您可以使用:

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

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

自从这个问题被提出已经过去了五年,Visual Studio 的新版本中是否有什么变化? - Misiu
绝对不是因为我现在也遇到了完全相同的问题。 - nicV

11
有时在这种情况下最简单的方法是创建一个空的子类来限定泛型参数。这通常用于ObservableCollection:
public class SomeItemCollection : ObservableCollection<SomeItem>{

}

这有点烦人,但它可能会解决你的问题。


3

像其他人所说的那样,Visual Studio Designer在处理控件中的泛型方面存在很大的问题。当我尝试实现类似于通用“属性查看器”类的东西时,我自己也遇到了这个问题。

对我有效的解决方案是定义一个中介类,就像Egor所说的那样。如果我正确理解你的问题,对于你的情况,应该是这样的:

public class PictureElementGallery : Gallery<PictureElement>

在表单上使用PictureElementGallery,而不是 Gallery < PictureElement >,这样设计师就不会有麻烦了。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接