【问题标题】:Is it Possible to Make a Generic Control in .Net 3.5?是否可以在 .Net 3.5 中进行通用控件?
【发布时间】:2008-12-27 19:32:45
【问题描述】:

我声明了以下通用用户控件:

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# 中创建通用用户控件?

【问题讨论】:

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


    【解决方案1】:

    试试这个

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

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

    【讨论】:

    • 是的,设计者是一个“愚蠢”的实例化者。它只能实例化具体的类——非抽象的、非泛型的。对于基类和您正在编辑的控件上的任何控件/组件都是如此。希望他们有一天会修复它......
    【解决方案2】:

    【讨论】:

    • 提供的链接已失效
    【解决方案3】:

    一方面,尽管在 .NET 下可以使用通用控件,但 Visual Studio 设计人员不支持它们,因此如果您想使用它们,您只能靠自己。您必须自己在代码中实例化它们并执行布局。

    至于你提到的错误,在我看来你的方向是错误的。也许你可以在这里写下整个错误文本?

    【讨论】:

      【解决方案4】:

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

      一个常见的折衷方案是拥有一个Type 属性(或一个object 模板属性,您可以在其上调用GetType()),然后在控件中简单地转换等。同样,这种用法通常会使用 Activator.CreateInstanceTypeDescriptor 之类的东西(用于元数据查找等)。

      【讨论】:

      • 我想我不记得在 ASP.NET MVC 中的强类型 ViewPage 上使用设计视图。设计师是否(或如何)处理这些?
      • 谢谢。但这是一个奇怪的疏忽。
      • 见罗伯特伍德的回答。这是一种解决该特定问题并仍然使用设计器的方法。尽管这是一种解决方法,但它比使用 Type 属性要好得多。
      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多