C#: использование типа "self" в качестве общего параметра?

Это может показаться немного странным, но мне действительно нужно создать обходной путь для очень сложной обработки дуплексной связи в C#, особенно чтобы заставить других разработчиков соблюдать принцип DRY.

так что я делаю, чтобы иметь мультитон на основе типа, который выглядит так:

internal sealed class SessionManager<T> where T : DuplexServiceBase

что не является проблемой вообще - до сих пор.

однако, как только я хочу, чтобы службы (я собираюсь с одним экземпляром за сеанс) регистрировались с The SessionManager, The hassle starts:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action>

(MessageDispatcherBase является моим классом, который создает поток и асинхронно отправляет сообщения).

Я хочу иметь метод, который выглядит так:

    protected void ProcessInboundMessage()
    {
        // Connect
        SessionManager<self>.Current.Connect(this);
    }

...но проблема в том, как мне добраться до"Я"?

мне действительно нужны отдельные менеджеры сеансов для каждого класса обслуживания, потому что у всех есть свои собственные уведомления (в основном это очень раздражает " NotifyAllClients" - метод, который заставляет нас хотеть вытащить собственные волосы за последние часы) и нужно лечить отдельно.

у вас есть идеи?

Я не хочу использовать "AsyncPattern = true", кстати... это потребует от меня отказаться от безопасности типа, принудительного соблюдения контракта (это приведет к очень плохому злоупотреблению системой связи, которую я устанавливаю здесь) и потребует отказа от сухого принципа, будет много повторяющегося кода повсюду, и это что-то, что я серьезно хмурюсь.

Edit:

я нашел наилучшее возможное решение, благодаря ответам здесь-это метод расширения, хе-хе...

    public static SessionManager<T> GetSessionManager<T>(this T sessionObject) 
        where T : DuplexServiceBase
    {
        return SessionManager<T>.Current;
    }

Я могу использовать это так:

GetSessionManager().Connect(this);

2 ответов


Я бы написал вспомогательный метод:

static class SessionManager { // non-generic!
    static void Connect<T>(T item) where T : DuplexServiceBase {
        SessionManager<T>.Current.Connect(item);
    }
}

и использовать SessionManager.Connect(this) что автоматически выяснит это с помощью вывода общего типа.


вы можете обернуть вызов в общий метод, тем самым воспользовавшись выводом типа компилятора:

private static void ConnectSessionManager<T>(T service)
{
     SessionManager<T>.Current.Connect(service)
}

protected void ProcessInboundMessage()
{
    // Connect
    ConnectSessionManager(this);
}