繁体   English   中英

C#泛型用户控件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM