Я реструктурирую код opur, чтобы использовать дженерики. Мы используем (по необходимости, здесь невозможно внести изменения) собственный код для присоединения / отсоединения / повторения / вызова делегатов. До того, как появились классы X, Y, Z, которые объявили свои собственные:
public delegate void Event_x_Delegate(ref ComParam pVal, out bool result);
В данный момент я передаю этот делегат в общий класс:
public sealed class Event_X_Handling : BasicEvent<Event_X_Handling.Event_x_Delegate>
с базовым событием
public abstract class BasicEvent<DELEGATE> : Loggable
where DELEGATE: class { ...
Это прекрасно работает, поэтому у меня была обобщена функциональность присоединения / отсоединения.
Но теперь я бы тоже хотел обобщить итерацию / вызов. Так как X, Y, Z отличаются только «ref ComParam pVal», то примерно так работает:
public abstract class BasicEventListener<EVENTPARAM1> :
BasicEvent<BasicEventListener<EVENTPARAM1>.BasicDelegate<EVENTPARAM1>> {
#region TYPES
public delegate void BasicDelegate<PARAM1>(ref EVENTPARAM1 pVal, out bool result);
#endregion
с изменением X, Y, Z на:
public sealed class Event_X_Handling : BasicEventListener<ComParam>
Но тут возникает проблема, скрывающаяся за углом: присоединение / отсоединение теперь работают с BasicEventListener.BasicDelegate . Но много кода. ссылается на Event_X_Handling.Event_x_Delegate , так как они, к сожалению, использовали синтаксис NET1.1 для создания делегатов (будучи набранным Event + = new Delegate_X (_listen) ).
Итак, вкратце: есть ли способ для псевдонима Event_x_Delegate к BasicDelegate ? Я действительно не вижу других возможностей.
PS: Конечно, я вижу, что с разбивкой базовых классов до динамического вызова при итерации / вызове я мог бы реализовать это без введения BasicDelegate . Но это не очень элегантно ИМХО.