Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/65: Рейтинг темы: голосов - 65, средняя оценка - 4.54
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705

Передать делегат с параметрами в аргументы метода

04.10.2014, 22:09. Показов 13186. Ответов 6
Метки нет (Все метки)

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

Хочу запилить класс под это дело, но вот не могу догнать как мне это реализовать... ведь мне получается в этот класс(далее MyInvoker) нужно передать делегат(или указатель на нужный метод) и что бы этот делегат был уже с нужной сигнатурой, и еще передать аргументы что б их передать при вызове этого делегата уже из моего MyInvoker.

Короче я сам не сильно понимаю как это все реализовать, но в двух словах должно быть так:
создаю объект класса MyInvoker;
передаю туда указатель на метод и все параметры для него;
вызываю этот метод с переданными рание параметрами из моего MyInvoker класса;

Но вот как мне писать сигнатуру принимающего метода в MyInvoker? Я же не знаю зарание сколько будет параметров... Ну как вариант object[], но как потом из этого массива параметров вытащить все и передать в метод(который указатель)?


Короче кто занимался такими делами подскажите реально ли такое сделать?

Добавлено через 17 часов 39 минут
Никаких идей?

Добавлено через 1 час 7 минут
Такс, дело продвинулось, нашел способ передавать любую функцию в мой класс, и потом ее вызывать, но теперь хочу с аргументами разобратся... Есть ли способ передавать делегат принимающий object[], и уже внутри моего класса узнать какие именно типы необходимы, и их точное количество для вызова функции, разобрать этот массив object[] и порозставлять нужные параметры в нужном порядке, аля "String.Format();"
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2014, 22:09
Ответы с готовыми решениями:

Невозможно передать ArrayList в аргументы метода без модификатора static у этого метода или метода main
Крч, хочу передать экземпляр класса ArrayList в метод, но ide говорит, что нельзя это сделать, пока сам метод или main не будут в...

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата с именем метода, имя метода...

Как сделать чтоб аргументы метода пользователь вводил с консоли а не в скобках метода во внешнем коде?
доброго времени суток!!! Помогите плиз!!! как сделать чтоб аргументы метода пользователь вводил с консоли а не в скобках метода во...

6
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,230
04.10.2014, 23:18
Цитата Сообщение от siriusED Посмотреть сообщение
object[]
Это массив объектов, то бишь System.Array class который, как и все, производный от object:
Можно передавать делегат, принимающий object, кастовать этот объект к массиву и разбирать этот массив, как вам угодно. Только разбирать точно надо, иначе RTE будет.

Добавлено через 1 час 0 минут
Если я правильно вас понял:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyInvoker
    {
        private object[] _pars;
        private Delegate _del;
 
        public MyInvoker(Delegate del, object[] pars)
        {
            _pars = pars;
            _del = del;
        }
 
        public void DoInvoke()
        {
            _del.DynamicInvoke(_pars);
        }
    }
Добавлено через 2 минуты
Понятно, что будет работать только если типы параметров и их число подходят сигнатуре метода.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
05.10.2014, 01:02  [ТС]
IamRain, Вот на данный момент я точно так же и реализовал, и вот даже вычитал как можно проверить сигнатуру делегата на количество и типы массива аргументов, но это какой-то жосткий костыль получается... Разве в .NET не предусмотрено нормальной конструкции?

Я вот тут скажем сейчас посмотрел на сам ивент типа вот такой вот:
C#
1
2
3
4
5
6
        public event EventHandler<EventArgs> myEv;
 
        private void SomeMethod()
        {
            myEv.Invoke(this, new EventArgs());
        }
Вот если бы я смог так же сделать свой "EventHandler" с методом Invoke(), то не нужно было бы во обще никаких костылей и прочих классов...

Вот как ме сделать свой "EventHandler<EventArgs>"? пробовал наследоватся - и от делегата наследоватся нельзя... Подскажет может быть кто?

Добавлено через 1 час 18 минут
Ну а так, то задача такая:
У меня есть левый класс(даже может быть в подключенной dll'ке), в нем есть ивент, этот ивент срабатывает в потоке созданном этим классом, я подписываюсь на этот ивент в моей форме(Form) и в обработчике этого ивента пишу:
C#
1
this.label1.Text = "text";
Вот у меня выдает ошибку "cross-thread Exception"...

Теперь вопрос: Как мне вызвать ивент из другого потока так,, что б ошибки не было и я имел доступ ко всем контролам на форме?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.10.2014, 01:13
Цитата Сообщение от siriusED Посмотреть сообщение
Ну а так, то задача такая:
Цитата Сообщение от siriusED Посмотреть сообщение
Как мне вызвать ивент из другого потока
siriusED, и ради такой простой задачи вы создаете какие-то конструкции? Все уже давно придумано.

Добавлено через 8 минут
Форма с кнопкой и лейблом.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
using System.Threading.Tasks;
 
namespace WindowsFormsApplication14
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += (sender, e) =>
                {
                    MyClass mc = new MyClass();
                    mc.classThreadEvent += (a, b) =>
                        {
                            this.Invoke((Action)(() =>
                                {
                                    label1.Text = b.data;
                                }));
                        };
                    mc.RunThread();
                };
        }
    }
    public class MyClass
    {
        public event EventHandler<MyEventArgs> classThreadEvent;
        public void RunThread()
        {
            Thread t = new Thread(new ThreadStart(Run));
            t.IsBackground = true;
            t.Start();
        }
        private void Run()
        {
            for (int i = 0; i < 10; i++)
            {
                if (classThreadEvent != null)
                    classThreadEvent(this, new MyEventArgs(i.ToString()));
 
                Thread.Sleep(1000);
            }
        }
    }
    public class MyEventArgs : EventArgs
    {
        public readonly string data;
        public MyEventArgs(string inData)
        {
            data = inData;
        }
    }
}
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
05.10.2014, 01:19  [ТС]
insite2012, Забыл уточнить, должно работать без использования:
C#
1
2
3
4
this.Invoke((Action)(() =>
{
   ...
}));
а сразу, как в стандартных ивентах
C#
1
label1.Text = b.data;
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.10.2014, 01:25
Цитата Сообщение от siriusED Посмотреть сообщение
должно работать без использования:
А зачем, позвольте спросить? Хотите поизвращаться? Костыли поизобретать? Какая цель сего действия?

Добавлено через 3 минуты
Цитата Сообщение от siriusED Посмотреть сообщение
как в стандартных ивентах
Это тот случай, когда работа происходит в том же потоке, где был создан UI. Из другого потока так не получится.
0
 Аватар для siriusED
32 / 31 / 13
Регистрация: 20.05.2010
Сообщений: 705
05.10.2014, 02:32  [ТС]
Ну я понял короче, я тут почитал уже много и короче так как я хотел сделать невозможно по факту, но желаемого результата я все таки добился, и решение оказалось простое как двери: я просто создал лейбл и через нее использую инвок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2014, 02:32
Помогаю со студенческими работами здесь

Делегат Func с несколькими параметрами в Task<Tresult>
Добрый день. В данный момент начал изучать TPL и возник вопрос по поводу использования параметризованного Task. История следующая: ...

Делегат в аргументе метода
Добрый день, есть метод и два его вызова, в чем их различие? static void Main() { Do(Go); ...

Делегат "Action<object>" не принимает аргументы 0
Task.Factory.StartNew(async () =&gt; { // Основной код }, TaskCreationOptions.LongRunning, token).ContinueWith((r) =&gt; { ...

Передать делегат (заранее неизвестный) в метод
Сразу к сути: нужно передать делегат (заранее не известный) в нутрь метода для использования - пытаюсь так: public static void...

Как написать делегат вместо лямбда-выражения и анонимного метода
Пытаюсь разобраться с делегатами и многопоточностью. Есть простой проект-пример на WinForms, с прогресбаром и циклом, эмулирующем работу....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru