将TDelegate作为事件的通用接口

本文关键字:接口 事件 TDelegate | 更新日期: 2023-09-27 18:26:04

我正在尝试创建这个简单的接口。我希望它能以某种方式引发一场活动。这就是我现在所拥有的(不编译,只是我的想法)

public interface IAsyncSearch<TTermType, TResultsEventType>
                                                 where TResultsEventType:delegate
{
    event TResultsEventType SearchCompletedEvent;
    void SearchAsync(TTermType term);
}

类似的事情可能吗?我知道where语句中需要一个类型。

将TDelegate作为事件的通用接口

试试这个

public interface IAsyncSearch<TData, TArgs>
{
    event EventHandler<SpecialDataEventArgs<TArgs>> SearchCompletedEvent;
    void SearchAsync(TData term);
}
public class SpecialDataEventArgs<T> : EventArgs
{
    public SpecialDataEventArgs(T data)
    {
        Data = data;
    }
    public T Data { get; private set; }
}

所有事件类型都应该派生自EventHandler<>,标准.NET事件处理程序类型。帮助任何阅读你的代码的人快速识别它。更合适的是,它很容易解决您的问题:

    public interface IAsyncSearch<TTermType, TResultsArgType> 
        where TResultArgType : EventArgs 
    {
        event EventHandler<TResultsArgType> SearchCompletedEvent;
        void SearchAsync(TTermType term);
    }

事件仅适用于委托类型。并且在C#中没有办法将类型参数约束为委托。正因为如此,我认为你想要的东西在C#中是不可能的。

根据Jon Skeet的说法,实际上在CIL中可以做到这一点,所以如果你在CIL里写那种类型,你就可以按照你想要的方式从C#中使用它。

EDIT:您可以在CIL中创建这样的类型,但似乎无法使用C#中的it属性。您似乎无法实现它。使用+=调用事件方法也不起作用。但是使用add_SearchCompletedEvent调用它们确实有效。