Я пытаюсь создать делегат события, в котором параметр строго типизирован для соответствия текущему классу, например:
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public event RequestCompleteHandler RequestComplete;
Проблема в том, что точка этого класса должна быть унаследована,и что я действительно хочу, чтобы все эти наследующие классы имели событие «RequestComplete», где делегат набирается для этого класса:
public class HPCGetConfig : HPCRequest
{
//I want this class to effectively inherit something like this:
//public delegate void RequestCompleteHandler(HPCGetConfig request);
Это потому, что в настоящее время, когда у меня есть функция, которая обрабатывает одиниз моих событий "RequestComplete", я в настоящее время должен сделать это:
myGetConfigRequest.RequestComplete += new HPCRequest.RequestCompleteHandler(HPCGetExpectedLosses_RequestComplete);
void HPCGetConfig_RequestComplete(HPCRequest request)
{
HPCGetConfig thisRequest = request as HPCGetConfig;
//This should be strongly typed in the first place.
Но я хочу иметь возможность сделать что-то вроде этого:
request.RequestComplete += new HPCGetConfig.RequestCompleteHandler(HPCGetConfig_RequestComplete);
request.SendRequestAsync();
}
void HPCGetConfig_RequestComplete(HPCGetConfig request)
{
request.RequestComplete -= HPCGetConfig_RequestComplete;
Попытки
Я пробовал это:
public delegate void RequestCompleteHandler<T>(T request) where T : HPCRequest;
public event RequestCompleteHandler<T> RequestComplete;
, но когда я пытаюсь вызвать событие из базового класса, используя RequestComplete(this);
, я получаю ошибку времени компиляции:`Delegate 'RequestCompleteHandler' имеет несколько недопустимых аргументов.
Это происходит независимо от того, настроил ли я весь класс HPCRequest
как HPCRequest<T>
, выполнив:
public class HPCRequest<T> where T : HPCRequest<T>
{
public delegate void RequestCompleteHandler<T>(T request);
public event RequestCompleteHandler<T> RequestComplete;
public class HPCGetConfig : HPCRequest<HPCGetConfig> { ...
Произошла та же ошибкакогда я пытаюсь вызвать событие: RequestComplete(this);
Я также попробовал все формы создания делегата и события и переопределения их, например, при выполнении:
public class HPCRequest
{
public delegate void RequestCompleteHandler(HPCRequest request);
public virtual event RequestCompleteHandler RequestComplete;
public sealed class HPCGetConfig : HPCRequest
{
public delegate void RequestCompleteHandler(HPCGetConfig request);
public override event RequestCompleteHandler RequestComplete;
Но это дает мне ошибку времени компиляции, потому что яне может переопределить событие RequestComplete с одним из делегатов другого типа.
Любые другие идеи?
Редактировать
Шаблонирование всего класса HPCRequestэто не вариант, после очень тщательной попытки я вижу, что он просто облажает каждую попытку использовать тип HPCRequest в качестве заполнителя для любого типа запроса.Если это решение будет работать, класс HPCRequest
должен иметь возможность создания экземпляра и наследования без указания параметра типа.Мне нужно решение, которое не требует шаблонов HPCRequest
.
Чтобы убедиться, что все точно знают, как я пытаюсь это использовать, я вставил пример кода в pastebin, который должен позволить вам поэкспериментировать сспособы заставить это событие работать, не нарушая ничего.Вот оно: http://pastebin.com/bbEYgLj1