Расширение C# TcpClient, повышающее преобразование базового класса

В настоящее время я пишу небольшой класс Tcp, способный к многопоточной обработке клиентов и так далее. Поэтому я должен расширить TcpClient в System.Net.Sockets для добавления дополнительных функций, таких как непосредственная запись строки и так далее. Теперь я немного застрял, когда дело доходит до преобразования базового класса TcpClient в TCP_ModifiedClient (расширенный класс).
В настоящее время я пытаюсь скопировать все свойства следующим образом, однако я получаю сообщение об ошибке, что сокет может быть назначен только тогда, когда он не подключен.
TcpClient, который должен быть преобразован с повышением частоты, подключен по дизайну.

Код для копирования свойств:
PropertyDescriptorCollection sp = TypeDescriptor.GetProperties(new TcpClient()); PropertyDescriptorCollection tp = TypeDescriptor.GetProperties(new TCP_ModifiedClient()); foreach (PropertyDescriptor pdt in tp) foreach (PropertyDescriptor pds in sp) if (pdt.Name == pds.Name) pdt.SetValue(this, pds.GetValue(client));

Есть ли какое-нибудь элегантное решение для этого? В худшем случае я бы добавил приватную переменную типа TcpClient в класс TCP_ModifiedClient при реализации всех общедоступных методов TcpClient, однако я надеялся отсортировать расширение с помощью наследования.

Я искренне надеюсь, что кто-то это сделает. способен помочь.

* ИЗМЕНИТЬ *
Хорошо. Я может быть не точно выразился.
Как упоминалось ранее, я пишу небольшой класс, способный обеспечить удобный способ создания серверных/клиентских приложений. Для этого я реализую класс замены TcpClient, добавляя такие функции, как запись/чтение в классе в/из базового потока TcpClient, автоматическое установление защищенного соединения AES и так далее. В настоящее время этот замещающий класс TCP_ModifiedClient наследуется от TcpClient. Поскольку сетевые функции .NET используют TcpClient, я должен реализовать метод преобразования из TcpClient в TCP_ModifiedClient. Поскольку моя текущая реализация TCP_ModifiedClient наследуется от TcpClient, я изначально намеревался добавить в TCP_ModifiedClient конструктор, принимающий TcpClient в качестве параметра, а затем назначающий его базовым классом TCP_ModifiedClient. Это явно не работает, поэтому в приведенном выше коде я попытался назначить все свойства из TcpClient в TCP_ModifiedClient.
Надеюсь, так стало немного понятнее. В настоящее время 1:15, так что извините за любое повторение/блокировку разума.


person Account015497    schedule 15.03.2015    source источник
comment
Что ты пытаешься сделать? Почему бы просто не получить класс или составить (внедрить) исходный экземпляр TcpClient? Помните ООП... Вы на неправильном пути... я думаю.   -  person Beachwalker    schedule 16.03.2015
comment
Почему вы используете Reflection и PropertyDescriptor? Нет нужды.   -  person Beachwalker    schedule 16.03.2015
comment
Я понятия не имею, что вы пытаетесь здесь сделать, но мне это кажется совершенно неправильным. Мне это кажется классической проблемой XY: meta.stackexchange.com/a/66378/134199   -  person Erik Funkenbusch    schedule 16.03.2015
comment
Ваше редактирование не помогает. Вы просто продолжаете говорить одно и то же и делать предположения, которые, вероятно, очень неверны. Вы говорите такие вещи, как «должен реализовать» и «Поэтому я должен...», когда, вероятно, вы ошибаетесь в этих вещах. Поскольку у TcpClient нет виртуальных методов, вы просто не можете ничего сделать, чтобы переопределить его своими собственными реализациями и использовать этот код при доступе в качестве TcpClient. К сожалению, он не предназначен для расширения, но вы мало что можете с этим поделать. Попробуйте другое решение.   -  person Erik Funkenbusch    schedule 16.03.2015
comment
Я видел редактирование, и мое представление о том, что вы пытаетесь сделать, не изменилось. Поскольку сетевые функции .NET используют TcpClient, если вы хотите передать TCP_ModifiedClient как TcpClient, вы должны сформировать отношения наследования. Но опять же, TcpClient не предназначен для наследования. Вы не можете скрыть бесполезных членов или переопределить их. Можете ли вы опубликовать демонстрационный код? Я не совсем понимаю проблему, которую вы хотите решить.   -  person usr    schedule 16.03.2015


Ответы (1)


Это интересный вопрос, потому что непонятно, в чем заключается недоразумение. Кажется, вы хотите создать класс, похожий на TcpClient, но работающий по-другому. Способ сделать это — написать такой класс самостоятельно и реализовать его. Для этого вы можете обернуть TcpClient.

В .NET невозможно скопировать свойства для имитации другого объекта. (Вы разработчик JavaScript?) Члены типа в .NET определены статически и не могут быть изменены. Поскольку TcpClient не выглядит так, будто он создан для наследования, вы также не можете достичь своей цели с помощью наследования. Вы должны реализовать новый класс.

Это правильный способ сделать это. Композиция предпочтительнее наследования, если наследование будет просто способом совместного использования кода и меньшего ввода. Не втягивайте всех TcpClient участников. Просто выставляйте те члены, которые вам нужны и которые имеет смысл выставлять. «В худшем случае сценарий» оказывается, что этот худший сценарий является лучшим с точки зрения дизайна.

person usr    schedule 15.03.2015