Память кучи похожа на кучу досок. Представьте, что вы учитель. Пока вы преподаете свой класс, доска принадлежит вам, и вы можете делать все, что хотите. Вы можете набросать на него и перезаписать материал по своему усмотрению.
Когда класс закончился, и вы собираетесь покинуть комнату, нет политики, требующей, чтобы вы удалили доску - вы просто передаете доску до следующего учителя, который, как правило, сможет увидеть, что вы записали.
Я думаю, что Вы хотите:
static object InvokeMethod(Delegate method, params object[] args){
return method.DynamicInvoke(args);
}
static int Add(int a, int b){
return a + b;
}
static void Test(){
Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4));
}
Печать "9".
взгляните на использование делегатов, вот яркий пример
, почему Вы используете отражение? когда-либо будет различное количество параметрических усилителей? или Вы знаете, что метод signture останется постоянным (также помнят, что C# поддерживает параметрические усилители [] ключевое слово)
HTH
Взгляд Серия Функционального программирования Justin Etheredge. Необходимо найти решение проблемы там.
Преобразование группы метода, анонимного метода или лямбда-выражения делегату требует, чтобы компилятор знал точный тип делегата. Однако Вы могли потенциально использовать лямбда-выражения и получили переменные для создания этого более простым:
public void InvokeMethod(Action action)
{
action();
}
public int Add(int a, int b)
{
return a + b;
}
public void Test()
{
InvokeMethod(() => Add(2, 3));
}
, Который в основном задерживает вызов нормальным способом, но путем обертывания фактического вызова к Add
в плоскости Action
делегат.
, Если это не выполняет Ваши требования, возможно, можно сказать нам немного больше о том, чего Вы действительно пытаетесь достигнуть.
РЕДАКТИРОВАНИЕ: Если это сгенерировано код, можно бросить к Func<...>
с правильными аргументами типа - предполагающий, что нет слишком многих. Кроме этого, нет никакого реального способа просто передачи в группе метода. Были случайные призывы "infoof (...)" оператор (как typeof, но для участников), который дал бы Вам MemberInfo, но это на самом деле не существует.
У Вас должен быть делегат сначала
delegate int Operation(int a, int b)
тогда, это становится:
public void InvokeMethod(Operation method, object target, object param)
{
method((int) target, (int) param);
}
Никакая потребность в любом вызове для Вызова.
Как с dbone я не уверен, почему Вам были бы нужны параметрические усилители [] массив. Вы разъяснили бы расширенное использование для параметрических усилителей?
кроме того, я должен буду исправить что-то в Вашем вопросе, хотя, потому что он вызовет ошибку компиляции: p
Что-то вроде этого должно работать на Вас:
delegate int MyDelegate(int a, int b);
public int Add(int a, int b) {
return a + b;
}
public void InvokeMethod(Delegate method, object[] param) {
Console.WriteLine(method.DynamicInvoke(param));
}
public Form1() {
InitializeComponent();
InvokeMethod(new MyDelegate(Add), new object[] { 1, 2 });
}
Удачи!