Указатель функции или чтото подобное

Здраствуйте колеги, у меня возник срочный вопрос, я извеняюсь если эта тема поднималась уже.Мне трубуется передавать в функцию(А) какую либо другую функцию(В), с разным количеством параметров и возращемым типом, и потом по ходу выполнения функции А вызывать эту функцию В есть ли способ такое реализовать, требуется очень строчно.
12 ответов

DimasSup, google C# delegates


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


разве что на 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());        }
только вот пользоваться этим не будет особо удобно


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


Хм... Спасибо вам... Всётаки прейдётся переписать коечтно и делать подругому, так как это слушком громоздко запутано и в коекаих случаешь не будет отвечать требование:((  Всёравно спасибо, что помогли быстро ! 


DimasSup, ну почему же...всё очень просто
        void MyMethodInvoker(MethodInfo method, Object owner)        {            if (owner != null)            {                //Здесь можем проверить что угодно                 //начиная от количества параметров и их типов                //и заканчивая возвращаемым результатом                //............                //...........                                //Ну а тут просто вызываем метод с нужными параметрами                object result = method.Invoke(owner, new object[] { ЗДЕСЬ_ПАРАМЕТРЫ_ДЛЯ_МЕТОДА });            }        }


DimasSup, ну почему же...всё очень просто
        void MyMethodInvoker(MethodInfo method, Object owner)        {            if (owner != null)            {                //Здесь можем проверить что угодно                 //начиная от количества параметров и их типов                //и заканчивая возвращаемым результатом                //............                //...........                                //Ну а тут просто вызываем метод с нужными параметрами                object result = method.Invoke(owner, new object[] { ЗДЕСЬ_ПАРАМЕТРЫ_ДЛЯ_МЕТОДА });            }        }
Хм... у функцию, которую я буду передовать нужно будет как-то менять, ну допустим у меня сейчас она вызывается так 
public float Calculator(Render_ device,int tek)
как она должна будет выглядить если использовать то что вы мне подсказали?


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


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)        {            // ........        }
Или нет?


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


только скорее не Action, а Func - должно что-то возвращатьсяа чем мой вараинт с делегатами не понравился? всяко проще рефлексии, при этом прекрасно поддерживаются Func-Action, а compile-time проверки аргументов и возвращаемого значения при данной постановке задания всё равно не добитьсят.е.
Console.WriteLine(Execute(p => string.Join("\r\n", p.Select(v => v != null ? v.ToString() : "null").ToArray())));


что может помешать - то, что у Action генерик-параметров количество ограниченно четырьмя 
Можно использовать массив параметров в качестве одного из параметровНу или добавить свои   
        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);
ну или..... в общем все в наших руках