Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.02.2020
Сообщений: 5

Рефлексия, создание экземпляров

26.12.2022, 21:04. Показов 702. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Хотел бы поинтересоваться у более опытных форумчан.
Можно ли с помощью рефлексии создать экземпляр интерфейса.
Что я имею в виду:

КЛИЕНТСКАЯ ЧАСТЬ
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace Client
{
  [ServiceContract]
  public interface IMyService
  {
    // Сложение
    [OperationContract]
    double GetSum(double i, double j);
    // Умножение
    [OperationContract]
    double GetMult(double i, double j);
  }
  class Program
  {
    static void Main(string[] args)
    {
      // Задаём адрес нашей службы
      Uri tcpUri = new Uri("http://localhost:8000/MyService");
      // Создаём сетевой адрес, с которым клиент будет взаимодействовать
      EndpointAddress address = new EndpointAddress(tcpUri);
      BasicHttpBinding binding = new BasicHttpBinding();
      // Данный класс используется клиентами для отправки сообщений
      ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(binding, address);
      // Открываем канал для общения клиента с со службой
      IMyService service = factory.CreateChannel();
      Console.ReadLine();
    }
  }
}
Как видно из примера используется какая-то фабрика для создания экземпляра интерфейса, причем динамически, так как экземпляр ни каким классом не был реализован.
Полагаю это фокусы рефлексии.

Как это повторить ? Без помощи готовых библиотек.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2022, 21:04
Ответы с готовыми решениями:

Создание сборок + рефлексия
Здравствуйте, Допустим есть у меня есть Form1 а Form2 используется как плагин. Читаю как вариант использование сборок то что можно делать...

Создание экземпляров класса
На метаните читал статью об пространстве имен, и увидел вот такую интересную штуку. Кажется, после ключевого слова new должно быть название...

Создание экземпляров класов
У меня эсть клас Class1. Я хочу в консоле создавать екземпляры этого класа и вводить название этого екземпляра с клавиатуры: string...

4
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
26.12.2022, 21:27
Цитата Сообщение от Sergik776 Посмотреть сообщение
для создания экземпляра интерфейса
Кто вам это сказал? Внимательно вникайте в имена типов - ChannelFactory - это фабрика канала.
На следующей строке создается этот самый канал.

Цитата Сообщение от Sergik776 Посмотреть сообщение
Как это повторить ?
Интерфейс по-определению нельзя создавать, поэтому ответ - никак. (Насколько я знаю).
Под капотом скорее всего создается реализация этого интерфейса, но клиентский код работает в терминах интерфейса. Как-то так.

И не нужно вам ничего повторять, судя по-всему, вы копаете не туда, куда нужно, если вообще нужно копать.

Добавлено через 6 минут
IMyService, насколько я понимаю, выступает тут как т.н. Proxy-объект, то есть вы дергаете его методы, а он под капотом, выполняет запрос на удаленный сервис, и после отдает результат.
До WCF-а существовала такая legacy технология - .NET Remoting - вот она работала аналогично, в связке с MarshalByRef типами. А потом пришел WCF и обобщил все наработанное в .NET Remoting.
0
0 / 0 / 0
Регистрация: 14.02.2020
Сообщений: 5
26.12.2022, 21:35  [ТС]
Все верно, создается канал.
Но этот канал имеет все те же методы, которые имеет переданный мною в фабрику интерфейс.
И фабрика каким-то образом "под капотом" реализует этот интерфейс.
Я так же хочу научиться реализовывать интерфейсы динамически.

Отступление: Когда-то я разрабатывал свой класс внедрения зависимостей. И благодаря этому опыту понял как работает внедрение зависимостей, смог понять что такое рефлексия. Теперь мне интересна эта тема.

Нашел Dynamic Language Runtime in C#. Возможно среда выполнения динамических языков позволит мне реализовывать интерфейсы во время выполнения кода...

Вы прекрасно поняли, что я имею в виду. И я понимаю о чем вы говорите, что имея проблему, её можно решить, не обязательно на столько изощренным способом. Но я хочу сказать, что я изучаю возможности платформы, а не решаю конкретные задачи.
Мои конкретные задачи уже решены более примитивными или общеизвестными принципами программирования.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
26.12.2022, 22:04
Лучший ответ Сообщение было отмечено Sergik776 как решение

Решение

Цитата Сообщение от Sergik776 Посмотреть сообщение
Возможно среда выполнения динамических языков позволит мне реализовывать интерфейсы во время выполнения кода...
Тут больше мета-программирование, чем DLR. DLR, насколько я понимаю, это просто ключевое слово dynamic в шарпе.

Тогда можете брать сборки с WCF-инструментарием, декомпилировать и изучать на досуге.
После строки:
C#
1
IMyService service = factory.CreateChannel();
Можете вызывать:
C#
1
var myTrickyType = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsAssignableTo(typeof(IMyService))).First();
И смотреть что-да как. Я бы копал в эту сторону.
1
0 / 0 / 0
Регистрация: 14.02.2020
Сообщений: 5
26.12.2022, 22:14  [ТС]
Огромное спасибо !)
Буду изучать )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2022, 22:14
Помогаю со студенческими работами здесь

Создание массива экземпляров класса
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { ...

Создание экземпляров класса в цикле.
Здравствуйте, у меня возник вопрос, ответы на который не удалось подыскать в инете - везде показывают, как динамически создавать всякие...

Создание массива экземпляров класса
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { ...

Создание многочисленных экземпляров класса в цикле
Например. Мы получили список людей, в нём n элементов. Для каждого надо создать экземпляр(но не вручную). Как их обозначить? ...

Оптимизация: цикл for и создание экземпляров типа-контейнера
Всем привет. Есть пара вопросов. Слышал где-то, что for это синтаксический сахар для while, что, в принципе, справедливо....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru