是否可以拥有通用代表?

时间:2015-05-12 08:14:50

标签: c# winforms generics

我有一个基本的通用usercontrol定义为:

public partial class BaseUserControl<T> : UserControl where T : class
{
    public event ItemsSelectedEventHandler ItemsSelected;
}

和一位代表:

public class ItemsSelectedEventArgs<T> : EventArgs
{
    public IEnumerable<T> Items { get; private set; }

    internal ItemsSelectedEventArgs(IEnumerable<T> items)
    {
        this.Items = items;
    }
}
public delegate void ItemsSelectedEventHandler(object sender, ItemsSelectedEventArgs<T> e);

此用户控件的一种方法是一次加载多个记录并将其作为IEnumerable<T>返回。然后,继承控件将是具体类型,它们将把事件提升到订阅者(即表单)。

但是,上面没有编译,我收到以下错误:

  

找不到类型或命名空间名称'T'(您是否缺少using指令或程序集引用?)

是否有可能以其他方式实现我的需要?

2 个答案:

答案 0 :(得分:5)

当然可以。错误发生在最后一行 - 您尚未将“T”声明为通用。而不是:

public delegate void ItemsSelectedEventHandler(object sender, ItemsSelectedEventArgs<T> e);

应该是:

public delegate void ItemsSelectedEventHandler<T>(object sender, ItemsSelectedEventArgs<T> e);

答案 1 :(得分:2)

public delegate void ItemsSelectedEventHandler<T>(object sender, ItemsSelectedEventArgs<T> e);

此外,您可以使用预定义的通用EventHandler<T>,如下所示:

public event EventHandler<ItemsSelectedEventArgs<SomeType>> SomeEvent;