C# 是否可以在.NET3.5中创建通用控件?

C# 是否可以在.NET3.5中创建通用控件?,c#,.net,winforms,generics,user-controls,C#,.net,Winforms,Generics,User Controls,我已声明以下通用usercontrol: public partial class MessageBase<T> : UserControl { protected T myEntry; public MessageBase() { InitializeComponent(); } public MessageBase(T newEntry) {

我已声明以下通用usercontrol:

public partial class MessageBase<T> : UserControl
    {
        protected T myEntry;
        public MessageBase()
        {
            InitializeComponent();
        }
        public MessageBase(T newEntry)
        {
            InitializeComponent();
            myEntry = newEntry;
        }    
    }
}
public部分类MessageBase:UserControl
{
保护性T髓鞘;
公共消息库()
{
初始化组件();
}
公共消息库(T newEntry)
{
初始化组件();
myEntry=newEntry;
}    
}
}
但是编译器不允许我这样做:

public partial class MessageControl : MessageBase<Post>
{
    public MessageControl()
    {
        InitializeComponent();
    }
}
public部分类MessageControl:MessageBase
{
公共消息控制()
{
初始化组件();
}
}

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

首先,尽管在.NET下可以创建通用控件,但Visual Studio设计器不支持这些控件,因此如果要使用它们,请自行决定。您必须自己在代码中实例化它们,并执行布局


至于你提到的那个错误,我觉得你看错方向了。也许您可以在这里编写完整的错误文本?

NET framework支持它们,但正如Vilx mantions所说,设计者根本不支持它们,而且任何基于xml/标记的平台(xaml(wpf)或ASP.NET)都不会喜欢泛型。所以最好的建议是:不要使用它们

一种常见的折衷方法是使用
Type
属性(或调用
GetType()
object
模板属性),并在控件中简单地强制转换etc。类似地,这种用法通常会使用诸如
Activator.CreateInstance
TypeDescriptor
(用于元数据查找等)之类的东西

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

public class MessageControlBase : MessageBase<Post>
{}
公共部分类MessageControl:MessageControlBase
{    
公共消息控制()
{
初始化组件();
}
}
公共类MessageControlBase:MessageBase
{}

让设计器工作的关键是,您正在编辑的类的基类不能是泛型的。

是。这是可能的。请参阅下面的链接以获得想法


我想我不记得在ASP.NET MVC的强类型视图页面上使用过设计视图。设计师是否(或如何)处理这些问题?谢谢。但这是一个奇怪的疏忽。参见罗伯特·伍德的答案。这是一种解决特定问题并仍然使用设计器的方法。尽管这是一种变通方法,但它比使用类型属性要好得多。是的,设计器是一个“愚蠢”的实例化器。它只能实例化具体的类——非抽象的、非泛型的。对于基类和正在编辑的控件上的任何控件/组件,都是如此。希望有一天他们能修复它…提供的链接已断开