[英]C# generics usercontrol
我想定义以下控件:
public partial class ObjectSelectorControl<T> : UserControl where T : class
问题是设计人员无法解决此问题。 有没有解决此问题的方法?
这有效
public class Control1<T> : UserControl { ... }
public class Control2 : Control1<double> { ... }
public class Control3 : Control2 { ... }
在这里阅读过:
听起来很像我们在项目中所做的。
有一个通用的基类:
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
{
...
}
为了能够使用设计器,控件可以执行或不能执行的操作受到一些限制。 从根本上讲,它们都围绕能够实例化您的类的设计器而展开(必须具有无参数构造函数,不能是abstract
,等等)。 因为设计人员不知道将什么类型作为通用参数传递(我怀疑这甚至是一个考虑),所以无法实例化您的类。
您最大的希望是创建UserControl
并将构造函数更改为protected
(我相信这会起作用,因为设计人员使用反射并忽略可见性,但我不是100%积极的)。 然后,您可以从该UserControl
继承并创建您的通用类,然后调用基( protected
)构造函数。
我认为这是不可能的,因为设计器会调用您的类的实例。 如果使用泛型,设计人员将不知道将哪种类型传递给“ T”。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876
该错误已发布到Microsoft的站点,您可以看到其标记为“推迟”,目前尚无解决方案! 。
使用组合代替泛型。 不要使用ObjectSelectorControl,而是使用另一种类型的通用成员(可能是Selector<T>
)并对该对象执行操作,而不是试图强迫自己成为通用对象。
我不知道在哪一点(使用哪个C#/。NET / VS版本更新),但是现在可以像创建任何其他通用类一样创建通用控件。
如果您以VS的标准方式创建UserControl
(即通过GUI添加),则只需在类声明的两个部分(“基本”类代码和设计器托管文件)中添加<T>
即可。 实际上,这就是引用代码中的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.