c# - 向现有系统类添加对象

标签 c# sockets extension-methods

目前,我有一个问题。我想用字符串扩展System.Socket类,在其中可以将信息存储到Socket。

例如,添加一个名为Name的变量,但是如果我这样写它,那么它将不起作用,因为所有套接字都具有相同的名称。有谁知道我该如何解决这个问题,或者最简单的方法是什么?

public static string Name;

public static string getName(this Socket socket)
{
    return Name;
}

public static void setName(this Socket socket, string name)
{
    Name = name;
}

最佳答案

您在这里至少有一些选择:

  • 坚持使用您在问题中显示的扩展方法。
  • 子类化Socket类,以便您可以将Name属性添加到类型本身。
  • 使用"Decorator Pattern"Socket类包装为您自己的具有Name属性的类型。

  • 如果要使用扩展方法,则需要为每个string对象维护一个不同的Socket值。一种实现方法是拥有一个字典,该字典将Socket对象引用映射到名称。例如:
    public static Dictionary<Socket, string> _socketNames = new Dictionary<Socket, string>();
    
    public static string getName(this Socket socket)
    {
        return _socketNames[socket];
    }
    
    public static void setName(this Socket socket, string name)
    {
        _socketNames[socket] = name;
    }
    

    子类化如下所示:
    class SocketEx : Socket
    {
        public string Name { get; set; }
    }
    

    包装看起来像这样:
    class SocketWrapper
    {
        public Socket Socket { get; }
        public string Name { set; set; }
    
        public SocketWrapper(Socket socket)
        {
            Socket = socket;
        }
    }
    

    面对如此含糊的书面问题,我们不可能知道哪种方法最适合您的特定需求。以上每种都有其优点和缺点。您必须自己决定哪个最适合您。

    关于c# - 向现有系统类添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39733957/

    相关文章:

    c# - 在 C# 中恶意使用 Maybe monad 和扩展方法?

    c# - 在 WCF 中自然排序 IQueryable 字符串

    c# - 如何在 Mono (Mono.Cairo/GTK#) 中访问 Linux 帧缓冲区?

    javascript - Node.JS + Express + Socket.IO - websocket 连接无效信息

    C 套接字 : Redirecting buffer to another file

    c# - 通用接口(interface)上的扩展方法,其中 T 是 Enumerable<K>

    c# - Swashbuckle:具有相同状态代码但不同描述/模型的多个 [SwaggerResponse]

    c# - Excel Interop : Creating instance with Task. 运行结果异常 System.EntryPointNotFoundException

    MySQL服务器远程连接?

    asp.net-mvc - 带参数编译的 Lambda 表达式