Возможно ли псевдоним / ссылка на делегата от делегата? - PullRequest
2 голосов
/ 17 марта 2009

Я реструктурирую код 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 . Но это не очень элегантно ИМХО.

Ответы [ 2 ]

11 голосов
/ 17 марта 2009

Perahps using псевдоним будет работать для вас?

using System;

using IntFunc = System.Func<int>;

namespace DelegateAlias
{
    class Program
    {
        static int foo() { return 314; }
        static void Main(string[] args)
        {
        IntFunc f = foo;
        }
    }
}
1 голос
/ 17 марта 2009

Нет, эквивалента typedef нет (я думаю, это то, что вы просите).

Я должен сказать, что поиск и замена могут быть вашими друзьями здесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...