C#: использование типа “сам” как универсальный параметр?

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

Таким образом, то, что я делаю, должно иметь основанную на типе мультитонну, которая похожа на это:

internal sealed class SessionManager<T> where T : DuplexServiceBase

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

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

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action>

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

Я хочу иметь метод, который похож на это:

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

... но проблема - как я добрался бы до "сам"?

Я действительно ДОЛЖЕН разделить менеджеры сеансов для каждого класса обслуживания, потому что у них всех есть свои собственные уведомления (в основном, это - очень раздражающий "NotifyAllClients" - метод, который делает, мы хотим вытащить мои собственные волосы в течение прошлых часов), и должен рассматриваться отдельно.

У Вас есть КАКИЕ-ЛИБО идеи?

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

Править:

Я нашел самое лучшее решение благодаря ответам здесь - это - ДОПОЛНИТЕЛЬНЫЙ МЕТОД, hehe...

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

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

GetSessionManager().Connect(this);

Миссия выполняется.:-D

Этот метод (принадлежит DuplexServiceBase) дает мне менеджер сеансов, с которым я хочу работать.Прекрасно!:-)

7
задан Turing Complete 5 July 2010 в 14:58
поделиться

2 ответа

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

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

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

15
ответ дан 6 December 2019 в 10:47
поделиться

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

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

protected void ProcessInboundMessage()
{
    // Connect
    ConnectSessionManager(this);
}
3
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: