Добавление объекта в существующий класс системы
На данный момент у меня проблема. Я хочу расширить 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;
}
}
С таким смутно написанным вопросом невозможно узнать, какой будет лучше для ваших конкретных потребностей. У каждого из вышеперечисленных есть свои плюсы и минусы. Вы должны решить для себя, что лучше всего подходит для вас.