Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель функции или чтото подобное 
:(
    Опции темы
DimasSup
  Дата 29.3.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Здраствуйте колеги, у меня возник срочный вопрос, я извеняюсь если эта тема поднималась уже.
Мне трубуется передавать в функцию(А) какую либо другую функцию(В), с разным количеством параметров и возращемым типом, и потом по ходу выполнения функции А вызывать эту функцию В есть ли способ такое реализовать, требуется очень строчно.
PM MAIL ICQ   Вверх
Partizan
Дата 29.3.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



DimasSup, google C# delegates


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DimasSup
Дата 29.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Делегаты разве позволяют присваивать функции с разнымы возращаемыми значениями и разным количеством параметров, если да то дайте пожалуста пример, а не отсылайте в... гугл. 

PM MAIL ICQ   Вверх
mihryak
Дата 29.3.2009, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



разве что на object перейти
Код

        public delegate object Func(params object[] parameters);

        public void Main()
        {
            Console.Write(Execute(ToStringFunc));
        }

        public string ToStringFunc(params object[] parameters)
        {
            StringBuilder sb = new StringBuilder();
            foreach (object parameter in parameters)
            {
                sb.AppendLine(parameter != null ? parameter.ToString() : "null");
            }
            return sb.ToString();
        }

        public object Execute(Func func)
        {
            return func(2, "blabla", Guid.NewGuid());
        }

только вот пользоваться этим не будет особо удобно

Это сообщение отредактировал(а) mihryak - 29.3.2009, 17:06
PM MAIL ICQ   Вверх
Partizan
Дата 29.3.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



DimasSup, ну мне это видится так, что нужно просто создать свой собственный класс-наследник класса Delegate

з.ы. хотя ещё проще - просто передавать в функцию A объект класса MethodInfo , который бы характеризовал метод B, и объект Object, которому принадлежит метод B. Ну а затем просто вызываем Invoke у объекта типа MethodInfo с нужными параметрами.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DimasSup
Дата 29.3.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Хм... Спасибо вам... Всётаки прейдётся переписать коечтно и делать подругому, так как это слушком громоздко запутано и в коекаих случаешь не будет отвечать требование:(( smile 
Всёравно спасибо, что помогли быстро ! 
PM MAIL ICQ   Вверх
Partizan
Дата 29.3.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



DimasSup, ну почему же...всё очень просто

Код

        void MyMethodInvoker(MethodInfo method, Object owner)
        {
            if (owner != null)
            {
                //Здесь можем проверить что угодно 
                //начиная от количества параметров и их типов
                //и заканчивая возвращаемым результатом
                //............
                //...........

                

                //Ну а тут просто вызываем метод с нужными параметрами
                object result = method.Invoke(owner, new object[] { ЗДЕСЬ_ПАРАМЕТРЫ_ДЛЯ_МЕТОДА });
            }
        }



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
DimasSup
Дата 29.3.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Цитата(Partizan @ 29.3.2009,  17:20)
DimasSup, ну почему же...всё очень просто

Код

        void MyMethodInvoker(MethodInfo method, Object owner)
        {
            if (owner != null)
            {
                //Здесь можем проверить что угодно 
                //начиная от количества параметров и их типов
                //и заканчивая возвращаемым результатом
                //............
                //...........

                

                //Ну а тут просто вызываем метод с нужными параметрами
                object result = method.Invoke(owner, new object[] { ЗДЕСЬ_ПАРАМЕТРЫ_ДЛЯ_МЕТОДА });
            }
        }

Хм... у функцию, которую я буду передовать нужно будет как-то менять, ну допустим у меня сейчас она вызывается так 
Код

public float Calculator(Render_ device,int tek)

как она должна будет выглядить если использовать то что вы мне подсказали?
PM MAIL ICQ   Вверх
Partizan
Дата 29.3.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



DimasSup, да как угодно выглядеть может )

Код

...
MethodInfo mi = this.GetType().GetMethod("Calculator");//Здесь вместо this может быть объект, которому принадлежит метод Calculator
this.MyMethodInvoker(mi, this); //Здесь опять же в аргументах вместо this должен быть объект-owner метода Calculator



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
-Mikle-
Дата 29.3.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



DimasSup, Возможно вы имели ввиду это:
Код

        private void test()
        {
            FunctionA((Action<int>)FunctionB1, new object[] { 234 });
            FunctionA((Action<int, string>)FunctionB2, new object[] { 234, "test test" });
        }

        private void FunctionA(Delegate functionB, object[] functionBArgs)
        {
            // call the functionB
            functionB.Method.Invoke(functionB.Target, functionBArgs);
        }

        private void FunctionB1(int value)
        {
            // ........
        }

        private void FunctionB2(int value, string str)
        {
            // ........
        }


Или нет?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Partizan
Дата 29.3.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



-Mikle-, тоже, кстати, вариант  smile 

Единственное, что может помешать - то, что у Action генерик-параметров количество ограниченно четырьмя smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mihryak
Дата 29.3.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



только скорее не Action, а Func - должно что-то возвращаться

а чем мой вараинт с делегатами не понравился? всяко проще рефлексии, при этом прекрасно поддерживаются Func-Action, а compile-time проверки аргументов и возвращаемого значения при данной постановке задания всё равно не добиться

т.е.
Код

Console.WriteLine(Execute(p => string.Join("\r\n", p.Select(v => v != null ? v.ToString() : "null").ToArray())));


Это сообщение отредактировал(а) mihryak - 29.3.2009, 19:13
PM MAIL ICQ   Вверх
-Mikle-
Дата 29.3.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(Partizan @  29.3.2009,  21:53 Найти цитируемый пост)
что может помешать - то, что у Action генерик-параметров количество ограниченно четырьмя 

Можно использовать массив параметров в качестве одного из параметров

Ну или добавить свои  smile 
Код

        public delegate void Action<T1, T2, T3, T4, T5>(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5);
        public delegate void Action<T1, T2, T3, T4, T5, T6>(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6);

или еще такой
Код

        public delegate void Action<TParams>(params TParams[] args);

ну или..... в общем все в наших руках smile


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0971 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.