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);
}