gpt4 book ai didi

C#:使用 "self"类型作为泛型参数?

转载 作者:太空狗 更新时间:2023-10-29 19:56:28 24 4
gpt4 key购买 nike

这可能看起来有点奇怪,但我确实需要为 C# 中非常复杂的双工 - 通信 - 处理创建一个变通方法,尤其是要强制其他开发人员遵守 DRY - 原则。

所以我正在做的是拥有一个基于类型的 multiton,如下所示:

internal sealed class SessionManager<T> where T : DuplexServiceBase

到目前为止完全没有问题。

但是,一旦我想让服务(每个 session 使用一个实例)向 SessionManager 注册自己,麻烦就开始了:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action>

(MessageDispatcherBase 是我的一个创建线程并异步发送消息的类)。

我想要一个看起来像这样的方法:

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

...但问题是 - 我怎样才能到达“ self ”?

我真的需要为每个服务类使用单独的 session 管理器,因为它们都有自己的通知(基本上这是非常烦人的“NotifyAllClients”——让我们想在最后几个小时里自己拔头发的方法)并且需要分别对待。

你有什么想法吗?

我不想使用“AsyncPattern = true”,顺便说一句......这将要求我放弃类型安全,强制遵守契约(Contract)(这将导致我正在设置的通信系统受到严重滥用在这里)并且需要放弃 DRY - 原则,到处都会有很多重复的代码,这是我非常不赞成的事情。

编辑:

我找到了最好的解决方案,多亏了这里的答案——这是一种扩展方法,呵呵...

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

我可以这样使用:

GetSessionManager().Connect(this);

任务完成。 :-D

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

最佳答案

我会写一个辅助方法:

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

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

关于C#:使用 "self"类型作为泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com