C#:使用“self”类型作为通用参数?

时间:2010-07-05 14:37:57

标签: c# wcf design-patterns singleton type-systems

这看起来有点奇怪,但我真的需要为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 = true”,顺便说一下......这需要我放弃类型安全,强制执行合同(这会导致我正在设置的通信系统滥用非常糟糕在这里,并且需要放弃DRY原则,整个地方会有很多重复的代码,这是我非常鄙视的。

修改

我找到了最好的解决方案,感谢这里的答案 - 这是一种扩展方法,呵呵......

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

我可以这样使用:

GetSessionManager().Connect(this);

任务完成。 :-D

此方法(属于DuplexServiceBase)为我提供了我想要使用的会话管理器。完善! : - )

2 个答案:

答案 0 :(得分:15)

我会写一个辅助方法:

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

并使用SessionManager.Connect(this),它将通过通用类型推断自动计算出来。

答案 1 :(得分:3)

您可以使用泛型方法包装调用,从而利用编译器的类型推断:

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

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