Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
.NET 4.x

Создание делегата через имя метода в строке

06.07.2011, 23:13. Показов 4121. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашёл как создать делегат с помощью анонимного метода или лямбда-оператора, но это как-то криво выглядит, т.к. приходится брать у искомого метода MethodBody. Можно ли как-то получить именно тот тип, что требуется делегату в параметр для создания нового объекта своего класса, имея лишь имя метода?

к примеру:
C#
1
2
delegate void Del();
Del d = new Del(Какой-то-метод("имя-моего-метода"));
 Комментарий модератора 
Темы не дублируем!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.07.2011, 23:13
Ответы с готовыми решениями:

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

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

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

11
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
07.07.2011, 00:22
немного непонятно, опишите подробней
0
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
07.07.2011, 00:28  [ТС]
У меня есть два проекта, в одном есть класс, у которого есть поле делегат. При запуске проекта в него подгружается файл с данными.
Второй проект является редактором, который формирует этот файл. Мне нужно передать информацию о поле класса, в котором должен содержаться конкретный делегат на конкретный метод указанный во втором проекте в текстбоксе. Оба проекта имеют доступ к dll, где располагается класс с методами из которых идёт выбор для делегата.

Нужно имея строку с именем метода, создать делегат.
0
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
07.07.2011, 00:33
использукйте какойнибудь универсальный делегат, в кторый любой метод влезет, чтото типо
C#
1
delegate object Del(object o=null);
0
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
07.07.2011, 00:36  [ТС]
Да нет, дело не в сигнатуре, мне непонятно именно как из строки с именем метода сделать то, что подходит для создания нового объекта делегата.
0
 Аватар для nuke4303
99 / 100 / 16
Регистрация: 30.03.2011
Сообщений: 350
07.07.2011, 00:46
мочжет чтото типо этого
C#
1
 Del d = (Del)Delegate.CreateDelegate(typeof(MyClass).GetMethod("metod").ReturnType, typeof(MyClass).GetMethod("metod"));
2
56 / 56 / 11
Регистрация: 13.04.2009
Сообщений: 169
07.07.2011, 01:02
Посмотри CSharpCodeProvider class. Если я правильно понял, то он должен тебе больше подходить.
1
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
08.07.2011, 17:08  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static public void Compile(string name, string source)
        {
            string code = "using System; using Something; namespace DataEditor {static class NewScript{public static void " + name + "(Param1T p1, Param2T p2){" + source + "}}}";
            CSharpCodeProvider cProv = new CSharpCodeProvider();
            CompilerParameters cParams = new CompilerParameters();
            cParams.ReferencedAssemblies.Add("mscorlib.dll");
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            cParams.ReferencedAssemblies.Add("Something.exe");
            cParams.OutputAssembly = "SomeScripts.dll";
            cParams.GenerateExecutable = false;
            cParams.GenerateInMemory = true;
            CompilerResults cResults = cProv.CompileAssemblyFromSource(cParams, code);
            if (cResults.Errors.Count != 0) 
            { foreach (var er in cResults.Errors) { MessageBox.Show(er.ToString()); } }
        }
После этого появляется файл .dll весом в 3 КБ и если я смотрю его в студии, видно что в нём пусто. Что не так?
0
56 / 56 / 11
Регистрация: 13.04.2009
Сообщений: 169
08.07.2011, 19:38
C#
1
2
3
var someMethod = cResults.CompiledAssembly.GetExportedTypes().Last().GetMethod(name, 
     BindingFlags.Static | BindingFlags.Public);
someMethod.Invoke(null, new object[] { "1", "2" });
чуть пришлось твой код под себя подправить. вот весь пример, но думаю разберешься
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            String name = "DoWork";
            String source = "MessageBox.Show(\"s1\"); MessageBox.Show(\"s2\");";
            string code = "using System; using System.Windows.Forms; namespace DataEditor {public static class NewScript{public static void " + name + "(String s1, String s2){" + source + "}}}";
            CSharpCodeProvider cProv = new CSharpCodeProvider();
            CompilerParameters cParams = new CompilerParameters();
            cParams.ReferencedAssemblies.Add("mscorlib.dll");
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            cParams.OutputAssembly = "SomeScripts.dll";
            cParams.GenerateExecutable = false;
            cParams.GenerateInMemory = true;
            CompilerResults cResults = cProv.CompileAssemblyFromSource(cParams, code);
            if (cResults.Errors.Count != 0)
            {
                foreach (var er in cResults.Errors)
                {
                    Console.WriteLine(er.ToString());
                }
            }
            var someMethod = cResults.CompiledAssembly.GetExportedTypes().Last().GetMethod(name, BindingFlags.Static | BindingFlags.Public);
            someMethod.Invoke(null, new object[] { "1", "2" });
0
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
08.07.2011, 23:18  [ТС]
Ммм.. Как я вижу, всё что касается компилирования тут тоже самое что и у меня, только добавлено как вызвать метод из скомпилированного. У меня проблема именно в том, что после компиляции мне нужна рабочая сохранившаяся dll, а она получается пустышка.
0
56 / 56 / 11
Регистрация: 13.04.2009
Сообщений: 169
08.07.2011, 23:55
C#
1
GenerateInMemory = true
параметр указывает на то, что сборка будет создана исключительно в памяти. если тебе надо сохранить в файл, сохрани, или поставь false
1
0 / 0 / 0
Регистрация: 06.07.2011
Сообщений: 7
09.07.2011, 16:15  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
            CSharpCodeProvider cProv = new CSharpCodeProvider();
            CompilerParameters cParams = new CompilerParameters();
            cParams.ReferencedAssemblies.Add("mscorlib.dll");
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            cParams.ReferencedAssemblies.Add("Something.exe");
            cParams.OutputAssembly = "SomeScripts.dll";
            cParams.GenerateExecutable = false;
            cParams.GenerateInMemory = false;
            CompilerResults cResults = cProv.CompileAssemblyFromSource(cParams, code);
в итоге попрежнему пустая dll, что ты имел в виду под сохранить в файл?

код который я компилил:

код
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public static void BB (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB1 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB2 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB3 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB4 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB5 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB6 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB7 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB8 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}public static void BB9 (){
bool b; bool c; bool d; bool a;
bool b1; bool c1; bool d1; bool a1;
bool b2; bool c2; bool d2; bool a2;
bool b3; bool c3; bool d3; bool a3;
bool b4; bool c4; bool d4; bool a4;
bool b5; bool c5; bool d5; bool a5;
bool b6; bool c6; bool d6; bool a6;
bool b7; bool c7; bool d7; bool a7;}


Добавлено через 13 минут
не знаю в чём было дело, но всё работает) спасибо

Добавлено через 13 минут
разобрался в чём было дело, оч глупо. просто не было публичных классов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2011, 16:15
Помогаю со студенческими работами здесь

Можно ли во время выполнения "извлечь" имя приложения, имя класса, имя исполняемого метода и пр. ?
или какие-нубдь "квазипеременные" компилятора, позволяющие их использовать?

Вызов метода(делегата) из неуправляемого кода
Есть способ передать адрес делегата в неуправляемый код как адрес функции, кто нибудь решил эту...

Запретить передачу частного метода посредством делегата
Как запретить такое поведение ? using System; namespace ConsoleApplicationNS2 { using...

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

Реализовать вызов метода с применением делегата
Основная задача: Генерация матрицы случайных чисел (размер задается пользователем) 3 метода:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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