将TDelegate作为事件的通用接口
本文关键字:接口 事件 TDelegate | 更新日期: 2023-09-27 18:26:04
我正在尝试创建这个简单的接口。我希望它能以某种方式引发一场活动。这就是我现在所拥有的(不编译,只是我的想法)
public interface IAsyncSearch<TTermType, TResultsEventType>
where TResultsEventType:delegate
{
event TResultsEventType SearchCompletedEvent;
void SearchAsync(TTermType term);
}
类似的事情可能吗?我知道where语句中需要一个类型。
试试这个
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
调用它们确实有效。