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

Оборачивание метода другим методом

26.09.2013, 15:15. Показов 1554. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
можно ли без использования анонимных делегатов заставить метод1 получать в виде параметра метод2
который будет выполнятса в теле метода1 в определенный момент, причем чтобы метод2 мог быть разный для одного и тогоже метода1

(поиском ничего внятного не нашел)

что то типа такого

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
using System;
namespace DelegateTests
{
    class TestClass
    {
        public static void stVoidA(int x, int y)
        {
            //что то делаеться
        }
        
        public static void stVoidB(string x, int y)
        {
            //что то делаеться
        }
 
        public static void stVoidC(string str)
        {
            //что то делаеться
        }
 
        public static void stVoidD()
        {
        
        //что то делаеться
        
        }
 
        public static void delVoid(func funcA)
        {
 
            Console.WriteLine("start del void");
 
            func(); //здесь  должна запуститься Функция переданая в параметре 
 
            Console.WriteLine("end del void");
 
        }
 
 
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            TestClass.delVoid(TestClass.stVoidA(1,1));
            TestClass.delVoid(TestClass.stVoidB("string",1));
            TestClass.delVoid(TestClass.stVoidC("string"));
            TestClass.delVoid(TestClass.stVoidD());
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2013, 15:15
Ответы с готовыми решениями:

Как использовать объект, созданный одним методом, другим методом?
Написал класс: class _MainMenu { private string _allOpenFileNameAndPath;//Массив...

Как из статического метода обратится к другим методам или компонентам формы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

The_content() оборачивание контента
Здравствуйте. Подскажите. При использовании на главной странице the_content(), весь выведенный...

Оборачивание запросов в хранимые процедуры
Всем привет, есть такое задание: создать хранимые процедуры на SELECT, INSERT/UPDATE и DELETE....

13
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
26.09.2013, 15:27 2
Можно просто в метод подавать делегат и в методе вызывать метод Invoke.
И запись выше не поменяется.
0
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 6
26.09.2013, 15:32  [ТС] 3
Цитата Сообщение от n1l Посмотреть сообщение
Можно просто в метод подавать делегат и в методе вызывать метод Invoke.
И запись выше не поменяется.
Извиняюсь а можно с примером ?
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
26.09.2013, 16:04 4
Цитата Сообщение от xsakabsx Посмотреть сообщение
Извиняюсь а можно с примером ?
Упс, насчет записи я перегнул палку.
Попутал с событиями.
В общем можно, но придется создавать доп. класс.

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
namespace ConsoleApplication6
{
    class Params
    {
        public int A { get; set; }
        public int B { get; set; }
        public string Str { get; set; }
    }
    class TestClass
    {
        public static void stVoidA(object param)
        {
            Params obj = (Params) param;
            Console.WriteLine(obj.A);
            Console.WriteLine(obj.B);
            //что то делаеться
        }
 
        public static void stVoidB(object param)
        {
            //что то делаеться
            Params obj = (Params)param;
            Console.WriteLine(obj.A);
            Console.WriteLine(obj.Str);
        }
 
        public static void stVoidC(object param)
        {
            //что то делаеться
        }
 
        public static void stVoidD()
        {
 
            //что то делаеться
 
        }
 
        public static void delVoid<T>(Action<T> funcA,T obj)
        {
            Console.WriteLine("start del void");
            funcA(obj); //здесь  должна запуститься Функция переданая в параметре 
 
            Console.WriteLine("end del void");
 
        }
 
 
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            TestClass.delVoid(TestClass.stVoidA, new Params {A = 1, B = 2});
            TestClass.delVoid(TestClass.stVoidB, new Params { A = 1, Str = "8"});
            //TestClass.delVoid(TestClass.stVoidB("string", 1));
            //TestClass.delVoid(TestClass.stVoidC("string"));
            //TestClass.delVoid(TestClass.stVoidD());
        }
    }
}
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
26.09.2013, 16:19 5
Цитата Сообщение от xsakabsx Посмотреть сообщение
можно ли без использования анонимных делегатов заставить метод1 получать в виде параметра метод2
Можно с использованием неанонимных делегатов.
А то что написал для вас n1l, делает компилятор при обработке вызова делегата. Так что без делегатов вы будете делать лишнюю работу.
Может поделитесь, чем вам не нравятся/не подходят делегаты?
0
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 6
26.09.2013, 16:25  [ТС] 6
n1l, спасибо но получаеться что с анонимными методами меньше кода и мороки = )

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
using System;
namespace DelegateTests
{
    class TestClass
    {
        public static void stVoidA(int x, int y)
        {
            //что то делаеться
        }
 
        public static void stVoidB(string x, int y)
        {
            //что то делаеться
        }
 
        public static void stVoidC(string str)
        {
            //что то делаеться
        }
 
        public static void stVoidD()
        {
 
            //что то делаеться
 
        }
 
        public delegate void Anonim();
 
 
        public static void delVoid(Anonim delegVoid)
        {
 
            Console.WriteLine("start del void");
            delegVoid.Invoke();
            //func.DynamicInvoke(); //здесь  должна запуститься Функция переданая в параметре 
 
            Console.WriteLine("end del void");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            TestClass.Anonim cur = delegate { TestClass.stVoidA(1, 1); };
            TestClass.delVoid(cur);
            cur = delegate { TestClass.stVoidB("ddd", 1); };
            TestClass.delVoid(cur);
            cur = delegate { TestClass.stVoidC("ddd"); };
            TestClass.delVoid(cur);
        }
    }
}
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
26.09.2013, 16:29 7
Если судить по коду, вам делегаты вообще не нужны. Вы можете эти методы просто вызывать.
0
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 6
26.09.2013, 16:32  [ТС] 8
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Можно с использованием неанонимных делегатов.
А то что написал для вас n1l, делает компилятор при обработке вызова делегата. Так что без делегатов вы будете делать лишнюю работу.
Может поделитесь, чем вам не нравятся/не подходят делегаты?
я просто думал что есть способ как в лиспе без особого гемороя засунуть метод в другой метод
Пример из жизни layfunc на его местов в параметре при вызове передаетса другая функция


Lisp
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
(defun ExportFunc (layfunc postfix)
  (showall)
                    ;(InsertAllXrefs)
  (setvar 'FILEDIA 0)
  (setq currentFileName (getvar 'dwgname))
  (setq currentFilePath (getvar 'dwgprefix))
  (setq blockName (vl-string-subst "" "_cvc" currentFileName 0))
  (setq blockName (vl-string-subst "" "_bvc" blockName 0))
  (setq blockName (vl-string-subst "" "_export" blockName 0))
  (setq blockName (vl-string-subst "" ".dwg" blockName 0))
  (setq blockName (strcat blockName "_" postfix))
  (setq newExportFileName (strcat currentFilePath BlockName ".dwg"))
  (vl-file-delete newExportFileName)
  (all_off)
  (layfunc)
  (rus_on)
  (setq selSetForBlock (ssget "_C" '(200.0 200.0) '(41850.0 29600.0)))
  (command "_.block"
       blockName
       (list 0.0 0.0)
       selSetForBlock
       ""
  )
  (command "_.oops")
  (command "_.wblock" newExportFileName blockName)
  (princ (strcat "\n экспортирован: " newExportFileName))
  (setq fileString (strcat fileString "," newExportFileName))
  (princ "\n test! ")
  (princ fileString)
  
  (setvar 'FILEDIA 1)
  (princ)
 
 
)
 
(defun eql_mr_export ()
  (exportfunc eql-mr_on "eql_mr")
)
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
26.09.2013, 16:39 9
Ну можете посмотреть как устроены методы в linq, и подавать лямбда выражение или что-то на подобе вкачестве параметра. Но это тоже анонимные делегаты.
1
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
26.09.2013, 16:41 10
Цитата Сообщение от xsakabsx Посмотреть сообщение
я просто думал что есть способ как в лиспе без особого гемороя засунуть метод в другой метод
Вам кажется, что это геморрой, кода на самом деле не много. Привыкните. К тому же есть уже готовые Func и Action с кучей вариантов и другие полезные делегаты, так что это не так страшно.
1
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 6
26.09.2013, 16:41  [ТС] 11
я просто пишу для автокада и мне надо и у меня есть вот такая обертка чтобы каждый раз не вписывать ее в саму функцию , хотел сделать её отдельной функцией которую можно использовать для многих вещей
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
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
 
// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(PRTM.Routine.Runtime))]
 
namespace PRTM.Routine
{
    /// <summary>
    /// Клас содержащий  рутинные методы для работы со средой
    /// </summary>
    public class Runtime
    {
        /// <summary>
        /// Анонимный делегат для обертки методов
        /// </summary>
        public delegate void AnonimVoid();
                /// <summary>
        /// Охохо
        /// </summary>
        /// <param name="CommandText">Текст</param>
        /// <param name="currVoid">делегат с обернутыми методами</param>
        public static void AttentionVoid(string CommandText, AnonimVoid currVoid)
        {
            Editor acED = Application.DocumentManager.MdiActiveDocument.Editor;
            PromptKeywordOptions acPromptKeywordOpt = new PromptKeywordOptions("Продолжить выполнение команды: " + CommandText);
            acPromptKeywordOpt.Keywords.Add("Да");
            acPromptKeywordOpt.Keywords.Add("Нет");
            PromptResult acRes = acED.GetKeywords(acPromptKeywordOpt);
 
            if (acRes.Status == PromptStatus.OK)
            {
 
                if (acRes.StringResult == "Да")
                {
                    currVoid();
                }
                else
                {
                    acED.WriteMessage("\n Команда {0} прервана", CommandText);
                }
            }
        }
    }
}
просто думал что есть способ сделать её без анонимных методов , чтобы вызов выглядел так

C#
1
Runtime.AttentionVoid("Разбитие блоков",Runtime.ExplodeBlc(true));
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
26.09.2013, 16:47 12
У компилятора C# есть одна полезная вешь: вы таки можете передавать методы без делегата в другой метод, а компилятор подставит нужный делегат сам. Например, есть метод и делегат
C#
1
2
public delegate int SomeDelegate(double arg);
public void MethodHandlesMethod(SomeDelegate d) { }
Вы можете передать метод вот так
C#
1
2
3
public int AnotherMethod(double d) {}
 
MethodHandlesMethod(new SomeDelegate(AnotherMethod));
А можете вот так
C#
1
MethodHandlesMethod(AnotherMethod);
Компилятор превратит второе в первое. Главное чтобы сигнатуры подходили.
0
0 / 0 / 0
Регистрация: 26.09.2013
Сообщений: 6
26.09.2013, 16:59  [ТС] 13
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Компилятор превратит второе в первое. Главное чтобы сигнатуры подходили.
А что делать если сигнатуры разные ?
у одного метода может быть 2 параметра у другого не одного
0
Администратор
Эксперт .NET
9602 / 4744 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
26.09.2013, 17:04 14
Цитата Сообщение от xsakabsx Посмотреть сообщение
А что делать если сигнатуры разные ?
Писать перегрузку метода, который принимает метод
C#
1
2
public void SomeMethod(Func<int, double, int> method) { }
public void SomeMethod(Func<int, double, int, double, decimal> method) { }
0
26.09.2013, 17:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2013, 17:04
Помогаю со студенческими работами здесь

Оборачивание элементов управления в классы
Всем привет, столкнулся с проблемой при оборачивании контролов в классы. Создаю общий класс Control...

Доказательство клауз, готовую задачу другим методом
Задача у меня решена правильно, но другим методом. Помогите пожалуйста переделать на метод...

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

Решение д/у методом модифицированного метода Эйлера
Добрый день. Задали написать задание в QBasic: Дифференциальное уравнение горизонтального полета...

Решение симплекс-методом в Matlab . Активация метода
Господа, требуется ваша помощь. Решаю задачу сиплекс-методом в Matlab. Нашел примеры кода программы...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru