Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
5 / 4 / 2
Регистрация: 24.09.2016
Сообщений: 423

При помощи делегата выполняется конструктор?

31.01.2024, 02:48. Показов 2239. Ответов 24

Студворк — интернет-сервис помощи студентам
Привет всем . . . есть такой код
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
    private static void Main(string[] args)
    {
      var builder = new ContainerBuilder();
      builder.RegisterType<GenericConcrete>().AsSelf();
      builder.RegisterType<Ctx>().As<ICtx>();
      builder.RegisterType<RepositoryStore>();
      var container = builder.Build();
 
      container.Resolve<RepositoryStore.Factory>();
      container.Resolve<GenericConcrete>();
    }
public interface ICtx { }
public interface IDep { }
public class Ctx : ICtx { }
 
public class GenericConcrete
{
  public GenericConcrete(RepositoryStore.Factory store) => store(typeof(int));
}
public class RepositoryStore
{
  public delegate RepositoryStore Factory(Type entity);
  public IDep Depend { get; private set; }
  public RepositoryStore(Type entity, ICtx ctx) => Console.WriteLine("invoke ctor");
}
Вопрос: как при помощи переменной делегата store на 18 строке кода вызывается конструктор класса RepositoryStore ? . .. ведь делегатом можно вызвать только метод, а конструктор нельзя(вроде как).
И второй вопрос: тут же вообще нет соответствия делегату по сигнатуре - а код выполняется. Почему ?

Добавлено через 1 минуту
Если сейчас будет ответ что это Autofac внедряет зависимости на 24 строке кода - то следующий вопрос: а какова в таком случае роль делегата Factory в выполнении кода конструктора ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2024, 02:48
Ответы с готовыми решениями:

Разрешить конструктор при помощи Autofac
Привет всем. Предположим, что есть такой код namespace ConsoleApp1 { public interface IConfigReader { } public interface...

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

Потоки: error C3350: System::Threading::ThreadStart: конструктор делегата ожидает 2 аргументов
коротко: public ref class Def : public System::Windows::Forms::Form { public: void Load_Graw (void) ...

24
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18391 / 14322 / 5370
Регистрация: 17.03.2014
Сообщений: 28,999
Записей в блоге: 1
01.02.2024, 01:43
Студворк — интернет-сервис помощи студентам
DLD, и что? Вас же не удивляет (я надеюсь) что в конструктор RepositoryStore передается экземпляр ICtx который вы явно не объявляли? Чем это отличается от делегата?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.02.2024, 01:47
Цитата Сообщение от DLD Посмотреть сообщение
Вроде как, все-равно неявные типы отношений нужно явно определять.
C# позволяет динамически в коде создавать классы реализующие определенные интерфейсы (привет от NUnit-тестов), причем не только путем компиляции созданного в райнтайме *.cs файла, а тупо оперируя кодом.
0
5 / 4 / 2
Регистрация: 24.09.2016
Сообщений: 423
01.02.2024, 02:48  [ТС]
Wolfdp, я думаю логика работы кода следующая(поправьте меня пожалста если я несу бред).
1.до 18 строки кода проблем нет
2.на 18 строке происходит вызов метода на который должен указать делегат
3.делегат ищет наилучшее соответствие по сигнатуре - не находит его в пользовательском коде - смотрит на подключенные библиотеки, ищет метод должен вернуть объект определенного класса, путем его создания. За создание таких объектов отвечает метод CreateInstance из класса Activator. Вот его он и вызывает - ведь других нет подходящих
4.Входящий параметр система определяет по этой же строке 18 чтобы не было ошибки компиляции.
5.Дальше метод CreateInstance вызывает конструктор пользовательского кода, причем с любым количеством параметров - тут сигнатура не имеет особого значения
---------------------
Почему я считаю метод CreateInstance единственным - а потому что я начинающий и другие методы мне не известны
Выходит эта часть кода выполняется без участия Autofac - самой системой ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18391 / 14322 / 5370
Регистрация: 17.03.2014
Сообщений: 28,999
Записей в блоге: 1
01.02.2024, 07:59
Цитата Сообщение от DLD Посмотреть сообщение
2.на 18 строке происходит вызов метода на который должен указать делегат
Не "должен указывать", а указывает.

Цитата Сообщение от DLD Посмотреть сообщение
3.делегат ищет наилучшее соответствие по сигнатуре - не находит его в пользовательском коде - смотрит на подключенные библиотеки, ищет метод должен вернуть объект определенного класса, путем его создания. За создание таких объектов отвечает метод CreateInstance из класса Activator. Вот его он и вызывает - ведь других нет подходящих
Вы несете бред Делегат не может ничего искать. Его экземпляр уже создан библиотекой Auotofac. Выще я показал как может выглядеть тело этого метода.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.02.2024, 10:33
Цитата Сообщение от DLD Посмотреть сообщение
Выходит эта часть кода выполняется без участия Autofac - самой системой ?
нет. IoC -- абстракция. Autofac -- конкретная реализация ioc, которая уже определяет будет ли авто-заполнение и зачем оно там. Последний вопрос в том числе к вам.

Даже больше -- вы сейчас роетесь в этом Autofac настолько подробно с какой целью? В 99% всё что нужно: указать какой интерфейс\тип чем будет реализовываться. Под "чем" подразумевают три варианта:
- явно передать объект
- передать делегат, возвращающий объект
- передать <Type>, чтобы через рефлексию его найти и создать (подставив нужные параметры)

Из ньюаснсов -- цикл жизни (singelton или что-то другое). Прям супер сложные конструкции обычно особо не регают, а выносят логику в всякие Factory\Manager\Provider.

Тупо изучение документации/либы слабо поможет. Пока не поработаете с относительно большим проектом где всё это используется -- понимания зачем и на кой надо будет приходить с трудом.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2024, 10:33

Анимация при помощи многократной перерисовки и при помощи манипуляции с палитрой
помогите, пожалуйста, написать программы на форме на С# по 2 видам анимации: 1) анимация при помощи многократной перерисовки изображения...

Разница лямбда выражения, делегата (\анонимного делегата), методом (\анонимных методов)
Всё просто: В чём отличия: лямбд, делегатов, анонимных делегатов, методов, анонимных методов? У меня в проге сучилась такая...

поиск максимального элемента оформить при помощи функции, а номера вторго элемента, равного максимальному-при помощи процедуры
В массиве А(5,10) определить в каждой строке номер второго элемента с конца строкиб равного максимального если такой есть. поиск...

Отличие делегата от делегата с лямбда-выражением
Народ чем отличается Invoke(new Action(() =&gt; button2.IsEnabled = true)); от Invoke(new Action(delegate(){ button2.IsEnabled = true;...

Конструктор в классе-наследнике не выполняется. Подскажите как исправить?
class Base{ public: virtual char f1()=0; virtual float f2()=0; }; class D1:public Base { private: char c; public:


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru