C#泛型用户控件(C# generics usercontrol)

2019-07-03 16:39发布

我想定义以下控制:

public partial class ObjectSelectorControl<T> : UserControl where T : class 

问题是,设计者无法解决这个问题。 有一种解决方法这个问题?

Answer 1:

这工作

public class Control1<T> : UserControl { ... }

public class Control2 : Control1<double> { ... }

public class Control3 : Control2 { ... }

曾在这里阅读:

一般用户控件?



Answer 2:

听起来很像是我们在我们的项目做。

有一个基类是通用的:

public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher
    where TBaseItem : new()
    where TBaseItemCollection : IItemCollection<TBaseItem>

然后,每次使用我们定义了一个非通用版本(这仍然无法设计者使用):

public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection>
{
}

...并可能在设计者使用,那么我们还派生的控件:

public partial class controlMessages : controlMessagesNonGenericParent
{
...
}


Answer 3:

有什么你可以控制或不能为了做才能够使用设计一些限制。 从根本上说,他们都围绕设计师能够实例化类(必须有一个参数的构造函数,不能是abstract ,等等)。 因为设计师不知道通过作为一般的参数是什么类型(我怀疑这是一个即使考虑),你的类不能被实例化。

你最希望的是创建你的UserControl和更改构造函数来protected (此,笔者认为,将工作,因为设计师使用了反射,而忽略知名度,但我不是100%肯定的)。 然后,您可以从继承UserControl和创建泛型类和调用基( protected )构造函数。



Answer 4:

我不相信这是可能的,因为设计者调用您的类的实例。 如果您使用泛型,设计师不知道进入“T”是什么类型。



Answer 5:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876

该错误已被发布到微软的网站,你可以看到,其标记为“延期”目前还没有解决! 。



Answer 6:

用的组合物,而不是仿制药。 代替使用ObjectSelectorControl的,得到另一种类型的(一个通用部件Selector<T>也许)和作用到该对象,而不是试图强迫自己是通用上。



Answer 7:

我不知道在这一点(与C#/。NET / VS verison更新),但现在它可以创建通用的控制您创建的任何其他通用类的方法相同。

如果您创建UserControl在VS的标准方式(通过GUI将其添加IE),只需添加<T>类声明(“基地”类代码和设计管理的文件)的两个部分。 其实,那是你在你的报价代码。



文章来源: C# generics usercontrol