Добавление объекта в существующий класс системы

На данный момент у меня проблема. Я хочу расширить System.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 ответ

У вас есть по крайней мере несколько вариантов здесь:

  • Придерживайтесь метода расширения, который вы показываете в своем вопросе.
  • Подкласс Socket класс, так что вы можете добавить Name свойство самого типа.
  • Используйте "Шаблон декоратора", чтобы обернуть 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;
    }
}

С таким смутно написанным вопросом невозможно узнать, какой будет лучше для ваших конкретных потребностей. У каждого из вышеперечисленных есть свои плюсы и минусы. Вы должны решить для себя, что лучше всего подходит для вас.

Другие вопросы по тегам