将对象添加到现有系统类

时间:2016-09-27 20:42:43

标签: 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;
}

1 个答案:

答案 0 :(得分:2)

这里至少有几个选项:

  • 坚持使用您在问题中显示的扩展方法。
  • 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;
    }
}

有了这样一个含糊不清的问题,我们无法知道哪种方法最适合您的具体需求。以上每一个都有其优点和缺点。你必须自己决定哪种方式最适合你。