是否可以在.Net 3.5中进行通用控制?

时间:2008-12-27 19:32:46

标签: c# .net winforms generics user-controls

我声明了以下Generic usercontrol:

public partial class MessageBase<T> : UserControl
    {
        protected T myEntry;
        public MessageBase()
        {
            InitializeComponent();
        }
        public MessageBase(T newEntry)
        {
            InitializeComponent();
            myEntry = newEntry;
        }    
    }
}

但编译器不允许我这样做:

public partial class MessageControl : MessageBase<Post>
{
    public MessageControl()
    {
        InitializeComponent();
    }
}

如何在C#中创建通用用户控件?

4 个答案:

答案 0 :(得分:16)

试试这个

public partial class MessageControl : MessageControlBase
{    
    public MessageControl()    
    {
        InitializeComponent();    
    }
}

public class MessageControlBase : MessageBase<Post>
{}

让设计人员工作的关键是你正在编辑的类的基类不能是通用的。

答案 1 :(得分:2)

答案 2 :(得分:1)

首先,虽然在.NET下可以使用通用控件,但Visual Studio设计人员不支持它们,所以如果你想使用它们,你就可以自己动手了。您必须在代码中自己实例化它们并执行布局。

至于你提到的错误,听起来像是你正朝错误的方向看。也许你可以在这里写出整个错误文本?

答案 3 :(得分:1)

.NET框架支持它们,但是作为Vilx提及,设计者根本不支持 - 任何基于xml /标记的平台(xaml(wpf)或ASP.NET)都不会喜欢泛型。所以最好的建议是:不要使用它们。

一个常见的折衷方案是拥有一个Type属性(或object模板属性,您可以在其上调用GetType()),并简单地在控件内投射等。同样,此类用法通常会使用Activator.CreateInstanceTypeDescriptor之类的内容(用于元数据查找等)。